【问题标题】:Declaring a static pointer to an inner class object in a template在模板中声明一个指向内部类对象的静态指针
【发布时间】:2014-12-15 00:59:11
【问题描述】:

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

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.

有什么想法吗?

【问题讨论】:

    标签: templates c++11 inner-classes static-members


    【解决方案1】:

    你需要使用typename关键字:

    template <class T_Satellite, class T_Key>
    const typename bst<T_Satellite, T_Key>::bst_node * bst::nullnode = bst_node(nullptr, nullptr);
    

    引用“从属名称”的错误消息是线索。 typename 必须用于所有引用类型的从属名称。如果名称涉及未绑定的模板参数,则名称为 "dependent"

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

    【讨论】:

    • 我的印象是现代编译器可以在单独的文件中处理模板定义......这与静态 const 变量有何不同?
    【解决方案2】:

    从属名称是那些依赖于模板参数的名称。从属名称不被视为类型以避免ambiguity - 编译器无法知道名称是指成员还是类型。这是您需要使用typename 关键字的地方。

    bst_node类型引用为

    template <class T_Satellite, class T_Key>
    const typename bst<T_Satellite, T_Key>::bst_node
    

    【讨论】:

      猜你喜欢
      • 2022-09-30
      • 2014-12-01
      • 1970-01-01
      • 2020-04-03
      • 2014-09-09
      • 2011-09-14
      • 1970-01-01
      • 1970-01-01
      • 2013-11-11
      相关资源
      最近更新 更多