我正在尝试为练习创建一个简单的模板二进制搜索树,我目前在头文件中有以下内容:
template <class T_Satellite, class T_Key>
class bst {
struct bst_node;
static const bst_node* nullnode;
}
我的问题目前源于尝试在cpp文件中定义nullnode
。我试过了:
template <class T_Satellite, class T_Key>
const bst<T_Satellite, T_Key>::bst_node * bst::nullnode = bst_node(nullptr, nullptr);
和
template <class T_Satellite, class T_Key>
const bst<T_Satellite, T_Key>::bst_node * bst::nullnode(nullptr, nullptr);
但似乎根本不起作用。我的cpp文件中也有bst_node
的定义。编译器吐出
'std::bst<T_Satellite,T_Key>::nullnode' : static data member cannot be initialized via derived class'
第一个例子中的以及
'std::bst<T_Satellite,T_Key>::bst_node' : dependent name is not a type.
有什么想法吗?
答案 0 :(得分:0)
依赖名称是依赖于模板参数的名称。依赖名称不被视为要避免的类型ambiguity - 编译器无法知道名称是指成员还是类型。您需要在此处使用typename
关键字。
请参阅类型bst_node
template <class T_Satellite, class T_Key>
const typename bst<T_Satellite, T_Key>::bst_node
答案 1 :(得分:0)
您需要使用typename
关键字:
template <class T_Satellite, class T_Key>
const typename bst<T_Satellite, T_Key>::bst_node * bst::nullnode = bst_node(nullptr, nullptr);
引用&#34;依赖名称&#34;的错误消息;是线索。 typename
必须用于引用类型的所有相关名称。如果名称涉及未绑定的模板参数,则名称为"dependent"。
此外,您几乎肯定需要将其移动到头文件中,因为除非您正在进行显式实例化,否则需要使用实际使用的模板参数来实例化名称。