这是我要编译的代码:
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/