Templates 声明指向模板中内部类对象的静态指针

Templates 声明指向模板中内部类对象的静态指针,templates,c++11,inner-classes,static-members,Templates,C++11,Inner Classes,Static Members,我正在尝试创建一个简单的模板二进制搜索树以供练习,目前我在头文件中有如下内容: template <class T_Satellite, class T_Key> class bst { struct bst_node; static const bst_node* nullnode; } 及 在第一个示例中,以及 'std::bst<T_Satellite,T_Key>::bst_node' : dependent name is not a type

我正在尝试创建一个简单的模板二进制搜索树以供练习,目前我在头文件中有如下内容:

template <class T_Satellite, class T_Key>
class bst {
    struct bst_node;
    static const bst_node* nullnode;
}

在第一个示例中,以及

'std::bst<T_Satellite,T_Key>::bst_node' : dependent name is not a type.
“std::bst::bst_节点”:依赖名称不是类型。

有什么想法吗?

依赖名称是那些依赖于模板参数的名称。依赖名称不会被视为要避免的类型-编译器无法知道名称是引用成员还是类型。这里需要使用
typename
关键字

请参阅类型
bst\u节点
as

template <class T_Satellite, class T_Key>
const typename bst<T_Satellite, T_Key>::bst_node
模板
常量类型名bst::bst_节点

您需要使用
typename
关键字:

template <class T_Satellite, class T_Key>
const typename bst<T_Satellite, T_Key>::bst_node * bst::nullnode = bst_node(nullptr, nullptr);
模板
const typename bst::bst_node*bst::nullnode=bst_node(nullptr,nullptr);
引用“依赖名称”的错误消息就是线索<代码>类型名称必须用于引用类型的所有从属名称。如果名称涉及未绑定的模板参数,则名称为


另外,,您几乎肯定需要将其移动到头文件中,因为除非您进行显式实例化,否则名称将需要使用实际使用的模板参数进行实例化。

我的印象是,现代编译器可以在单独的文件中处理模板定义……这与静态常量有什么不同变量
'std::bst<T_Satellite,T_Key>::bst_node' : dependent name is not a type.
template <class T_Satellite, class T_Key>
const typename bst<T_Satellite, T_Key>::bst_node
template <class T_Satellite, class T_Key>
const typename bst<T_Satellite, T_Key>::bst_node * bst::nullnode = bst_node(nullptr, nullptr);