C ++:尝试在模板中创建一个const静态成员

时间:2013-12-04 06:11:43

标签: c++ templates

以下是我要编译的代码:

foo.h中:

#include <limits>

template <typename T> class STreeNode {
public:
    T key;
    STreeNode<T>* child[2];
    STreeNode( const T& k ) :
        key(k), child{ nullptr, nullptr } {}; 
};

template <typename T>
class STree {
    STreeNode<T> *root;
    static constexpr T sentinel1 = std::numeric_limits<T>::min();
    static constexpr T sentinel2 = std::numeric_limits<T>::max();
public:
    STree() {
        root = new STreeNode<T>( sentinel1 );
    }
};

然后我用:

实例化它
#include <limits>
#include "foo.h"

int main() {
    STree<long long> t;
}

这编译很好,但是当它试图链接时,我得到一个未定义的STree<long long int>::sentinel1引用。我该如何解决这个问题?

1 个答案:

答案 0 :(得分:2)

必须在翻译单元中初始化静态成员。实例化模板时,编译器会生成声明它的代码。我还没有机会使用constexpr,但是我打赌你不能在模板类定义中分配静态成员,因为你必须在类之外包含静态初始化。我认为以下内容可行:

template <typename T>
class STree {
    STreeNode<T> *root;
    static const T sentinel1;
    static const T sentinel2;
public:
    STree() {
        root = new STreeNode<T>( sentinel1 );
    }
};

template<typename T>
const T STree<T>::sentinel1 = std::numeric_limits<T>::min();

template<typename T>
const T STree<T>::sentinel2 = std::numeric_limits<T>::max();