C++ c++;使用具有结构成员的泛型类时出现编译器错误

C++ c++;使用具有结构成员的泛型类时出现编译器错误,c++,class,generics,struct,tree,C++,Class,Generics,Struct,Tree,我正在构建一个包含结构TreeNode的通用二叉树。我实现了一个函数rootPtr(),它返回指向树根的指针。binarytree.h简单如下: template <class T> class BinaryTree { public: typedef struct TreeNode { T item; TreeNode *leftChildPtr; // pointer to left child TreeNode *rightChildPtr; pub

我正在构建一个包含结构TreeNode的通用二叉树。我实现了一个函数rootPtr(),它返回指向树根的指针。binarytree.h简单如下:

template <class T>
class BinaryTree {
public:

typedef struct TreeNode {
    T item;
    TreeNode *leftChildPtr; // pointer to left child
    TreeNode *rightChildPtr;

public:
    TreeNode(const T& nodeItem,
            TreeNode *left,
            TreeNode * right)
    : item(nodeItem), leftChildPtr(left), rightChildPtr(right) {
    }

    TreeNode(const T & nodeItem)
    : item(nodeItem) {
        leftChildPtr = NULL;
        rightChildPtr = NULL;
    }
  } TN; //end treenode

//Function prototype
TN* rootPtr() const;

private:
    TN *root;

} //end binarytree
模板
类二叉树{
公众:
类型定义结构树节点{
T项;
TreeNode*leftChildPtr;//指向左子级的指针
TreeNode*rightChildPtr;
公众:
TreeNode(const T&nodeItem,
TreeNode*左,
树节点(右)
:项(nodeItem)、leftChildPtr(左)、righchildptr(右){
}
TreeNode(const T&nodeItem)
:项目(nodeItem){
leftChildPtr=NULL;
rightChildPtr=NULL;
}
}TN;//末端树节点
//功能原型
TN*rootPtr()常量;
私人:
总氮*根;
}//结束二进制树
这是binarytree.cpp中导致错误的代码段

template <class T>
BinaryTree<T>::TN* BinaryTree<T>::rootPtr() {
    return root;
}
模板
BinaryTree::TN*BinaryTree::rootPtr(){
返回根;
}
编译器抱怨错误:在“*”标记之前需要构造函数、析构函数或类型转换
我以前见过这个错误,并使用类似于
BinaryTree::
的方法处理它,但这次由于它是泛型的,我不知道该怎么办。任何帮助都将不胜感激。

简化的经验法则:当类在单独的cpp文件中有模板时,您不能定义成员函数。尝试将其与类定义放在一起,放在标题上;)

简化的经验法则:当类在单独的cpp文件中有模板时,不能定义成员函数。尝试将其与类定义放在一起,放在标题上;)

尝试在函数定义中的返回类型之前添加
typename
,因为
TN
是从属类的成员。

尝试在函数定义中的返回类型之前添加
typename
,因为
TN
是一个依赖类的成员。

添加
typename
会产生另一个错误:在“TN”之前需要嵌套名称说明符ISO C++禁止声明“tn”,没有类型,你<代码>包含源文件中的头文件,添加<代码>类型名< /C> >另一个错误:“TN”之前的预期嵌套名称说明符ISO C++禁止声明“TN”,没有字体,你的代码>包含了源文件中的头文件?我接受你的答案,但是你知道这是解决办法。我仍然想知道我怎样才能做到上面的格式。我接受你的答案,但你知道这是一个解决办法。我仍然想知道我怎样才能做到上面的格式。