![](/img/trans.png)
[英]“undefined reference” to static member of template class accessed from static method
[英]Undefined reference to static member of class template referenced from static instance
请查看以下内容:
#include <string>
#include <unordered_map>
template <int N> class Object;
template <int N> class Thing;
template <int N>
class Factory {
private:
using FuncPtr = Object<N>*(*)(Thing<N>*);
static std::unordered_map<std::string, FuncPtr> map;
public:
static void insertInMap (const std::string& tag, FuncPtr funcPtr) {
map.emplace (tag, funcPtr);
}
};
template <int N>
std::unordered_map<std::string, typename Factory<N>::FuncPtr> Factory<N>::map;
// won't compile on GCC 4.8.1:
//template <> std::unordered_map<std::string, typename Factory<0>::FuncPtr> Factory<0>::map;
template <int N> struct Object {};
struct Blob : Object<0> {
static Blob prototype;
Blob() {Factory<0>::insertInMap ("Blob", Blob::create);}
Blob (Thing<0>*) {/* */}
static Object<0>* create (Thing<0>* x) {return new Blob(x);}
};
Blob Blob::prototype; // Calls up Factory<0>::insertInMap during compile time, but crashes when run.
int main()
{
}
因此,似乎Blob Blob::prototype;
由于Factory<0>::map
尚未实例化而崩溃,因此我尝试使用以下行实例化它:
template <> std::unordered_map<std::string, typename Factory<0>::FuncPtr> Factory<0>::map;
但无法编译(使用GCC 4.8.1):
C:\Users\Andy\AppData\Local\Temp\ccsGlFeV.o:Practice.cpp:(.text$_ZN7FactoryILi0E
E11insertInMapERKSsPFP6ObjectILi0EEP5ThingILi0EEE[__ZN7FactoryILi0EE11insertInMa
pERKSsPFP6ObjectILi0EEP5ThingILi0EEE]+0x14): undefined reference to `Factory<0>:
:map'
collect2.exe: error: ld returned 1 exit status
不必专门为<0>
Factory<N>::map
,而只需显式实例化整个类:
template class Factory<0>;
代替//template <> ...
UPDATE
对于Visual Studio,即使在首次使用前已显式实例化了模板,它似乎仍然无法初始化静态字段,您可以选择使整个类专用化:
template <>
class Factory<0> {
private:
typedef Object<0>*(*FuncPtr)(Thing<0>*);
static std::unordered_map<std::string, FuncPtr> map;
public:
static void insertInMap (const std::string& tag, FuncPtr funcPtr) {
map.emplace (tag, funcPtr);
}
};
std::unordered_map<std::string, Factory<0>::FuncPtr> Factory<0>::map;
或为Factory<0>
定义字段(尽管我不知道为什么VS接受它并且不触发错误,因为语法无效):
std::unordered_map<std::string, Factory<0>::FuncPtr> Factory<0>::map;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.