C++:试图在模板中创建一个常量静态成员

标签 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;
}

这编译很好,但是当它尝试链接时,我得到一个 undefined reference STree<long long int>::sentinel1 .我该如何解决这个问题?

最佳答案

静态成员必须在翻译单元中初始化。当您实例化模板时,编译器会在声明它的地方生成代码。我还没有机会使用 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();

关于C++:试图在模板中创建一个常量静态成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20368268/

相关文章:

java - Mat 到 MatOfPoint2f

c++ - 菱形继承(钻石问题)

c++ - 以一个vector<char>作为参数,然后转换为string

c++ - 模板推导似乎是错误的

C++ toString 成员函数和 ostream 运算符 << 通过模板集成

c++ - `typename` 什么时候不能被 `class` 替换?

c++ - ifstream.eof() 在 C++ 中未评估为真

c++ - 分别更改左右声道音量 waveOut SetVolume C++

c++ - 无法从函数参数的默认参数中推断出模板参数

php - Smarty 日期和时间比较