关于模板类的静态数据成员未初始化的一些问题。不幸的是,这些都没有能够帮助我解决我的具体问题的答案。
我有一个模板类,它有一个静态数据成员,必须为特定类型显式实例化(即必须专门化)。如果不是这种情况,使用不同的模板函数应该会导致链接器错误。
这是一些代码:
#include <iostream>
template <typename T>
class Instantiate {
public:
static Instantiate instance;
private:
Instantiate(std::string const &id) {
std::cout << "Instantiated " << id << "." << std::endl;
// Additional, important side effects...
}
};
template <typename T>
void runme() {
// Do something to ensure instance is instantiated,
// without creating run-time overhead.
// The following only works without optimization.
void *force = &Instantiate<T>::instance;
}
// Instances need to be explicitly specialized for specific types.
template <> Instantiate<int> Instantiate<int>::instance = {"int"};
int main() {
// This is OK, since Instantiate<int>::instance was defined.
runme<int>();
// This should cause a (linker) error, since
// Instantiate<double>::instance is not defined.
runme<double>();
}
调用runme<T>
应该要求它Instantiate<T>::instance
被定义,而不是实际使用它。得到一个instance
如图所示的指针是可行的——但前提是没有启用优化。我需要一种至少可以使用的不同方法O2
,并且如果 的实例化instance
发生在不同的编译单元中也可以使用。
问题:如何确保在使用未明确定义/专门化runme
的类型调用时出现链接器错误?T
Instantiate<T>::instance