C++ 二进制节点';不命名类型

C++ 二进制节点';不命名类型,c++,function,class,member,C++,Function,Class,Member,我在.h标题中有一个类,其中包含一个结构: template <typename DataType> class BST { public: struct BinaryNode { // variables }; //functions private: BinaryNode *findMin(BinaryNode *t) const; //done BinaryNode *findMax(BinaryNode *t)

我在
.h
标题中有一个类,其中包含一个结构:

template <typename DataType>

class BST
{
public:
    struct BinaryNode
    {
       // variables
    };
    //functions
private:
    BinaryNode *findMin(BinaryNode *t) const; //done
    BinaryNode *findMax(BinaryNode *t) const; //done
    //other functions and variables
};
我在
BinaryNode*BST::findMax(BST::BinaryNode*t)
findMin
上得到一个错误,
BinaryNode没有命名类型


我尝试过使用
BinaryNode*
,但也有相同的错误。

BinaryNode不在全局名称空间中。而且,它不是一个模板化结构,它只是一个类中碰巧被模板化的结构

因此,
BST::BinaryNode
是您在模板化BST类主体之外寻找的内容。如果您指的是当前模板扩展的BinaryNode,则可以在BST内部将其称为BinaryNode


(您必须提到您的体外定义对应于哪个模板参数化…,正如@Svalorzen更完整的回答所提到的。)

您没有为函数的返回参数指定类型,而是为
二进制节点
输入参数指定了一个模板参数

template <typename DataType>
class BST
{
public:
    struct BinaryNode
    {
       // variables
    };
    //functions
private:
    BinaryNode *findMin(BinaryNode *t) const; //done
    BinaryNode *findMax(BinaryNode *t) const; //done
    //other functions and variables
};

template <typename DataType>
typename BST<DataType>::BinaryNode* BST<DataType>::findMin(BST<DataType>::BinaryNode *t) const
{
   //do something
}

template <typename DataType>
typename BST<DataType>::BinaryNode* BST<DataType>::findMax(BST<DataType>::BinaryNode *t) const
{
   //do something
}
模板
BST级
{
公众:
结构二进制节点
{
//变数
};
//功能
私人:
BinaryNode*findMin(BinaryNode*t)const;//完成
BinaryNode*findMax(BinaryNode*t)常量;//完成
//其他函数和变量
};
模板
typename BST::BinaryNode*BST::findMin(BST::BinaryNode*t)const
{
//做点什么
}
模板
类型名BST::BinaryNode*BST::findMax(BST::BinaryNode*t)常量
{
//做点什么
}
或缩短输入参数:

template <typename DataType>
typename BST<DataType>::BinaryNode* BST<DataType>::findMax(BinaryNode *t) const
{
   //do something
}
模板
类型名BST::BinaryNode*BST::findMax(BinaryNode*t)常量
{
//做点什么
}
请注意,返回参数需要完整指定,因为当编译器到达那里时,它还不知道它正在读取BST类的函数实现。此外,
typename
是必需的,因为该上下文中的
BinaryNode
是一个依赖于模板的类型名,除非您将其显式化,否则编译器无法知道这一点

template <typename DataType>
typename BST<DataType>::BinaryNode* BST<DataType>::findMax(BinaryNode *t) const
{
   //do something
}