I am trying to make the project for BinaryTree Operations, the following are the class prototype with the code in which I am having the problem.
BinaryTree Class in BinaryTree.h file
template <class T>
class BinaryTree
{
   public:  
       BinaryTree();
       BinaryTree(T);     
};
The constructor implementation in BinaryTree.cpp
template<class T>
struct isPointer
{
  static const bool value=false;
};
template<class T>
struct isPointer<T*>
{
  static const bool value=true;
};
template<class T>
BinaryTree<T>::BinaryTree():root(nullptr)
{
  //ctor
}
template<class T>
BinaryTree<T>::BinaryTree(T data)
{
  if(isPointer<T>::value == true)
  {
   if(data != nullptr)
   {
      //Do something
   }
  }      
}
BinaryTreeOperations Class inherit BinaryTree Class and its prototype is defined in BinaryTreeOperations.h
template<class T>
class BinaryTreeOperations:public BinaryTree<T>
{
  public:
  //Constructors
  BinaryTreeOperations();
  BinaryTreeOperations(T);
};
While the constructors are defined in BinaryTreeOperations.cpp class
template<class T>
BinaryTreeOperations<T>::BinaryTreeOperations(T data):BinaryTree<T>(data)
{
  //ctor
}
The main function in Main.cpp file
int main()
{
  cout << "Hello world!" << endl;
  BinaryTreeOperations<std::string> b("1");
}
And now the error which g++ is throwing is
no match for 'operator!=' (operand types are 'std::__cxx11::basic_string' and 'std::nullptr_t')
at line
if(data != nullptr)
in BinaryTree Constructor defined in BinaryTree.cpp class
Here comes the issue. I have already defined isPointer structure to check whether the given template is pointer or not. But it seems, in spite of T being std::string g++ is going in if(isPointer<T>::value == true)
condition. 
I don't understand what am I doing wrong? Any sort of guidance will be deeply appreciated.
 
     
     
    