我有一个模板类的标题,它只有静态函数和字段。

template<typename T> class Luaproxy {

    static std::map<std::string, fieldproxy> fields;
    static const char * const CLASS_NAME;
    static void addfields();
    static int __newindex(lua_State * l){
        //implemented stuff, references to fields...
    }
    //etc
}

正如你所看到的,有些函数只是被声明了,因为我打算用模板特化来实现它们。

在 .ccp 文件中,我有:
struct test { int a; }
template<> map<string, fieldproxy> Luaproxy<test>::fields;
template<> const char * const Luaproxy<test>::CLASS_NAME=typeid(test).name();
template<> void Luaproxy<test>::addfields(){
    //stuff, references to fields...
}

我从头文件中实现的函数和仅在 .cpp 中实现的函数都收到了对 Luaproxy<test>::fields 的 undefined reference 错误。请注意,在链接中似乎可以找到 Luaproxy<test>::CLASS_NAMELuaproxy<test>::addfields

是什么让 map 如此特别?

最佳答案

我终于设法让它工作了,但我真的说不出为什么我的编译器(gcc 4.6.1)需要这样:template<> std::map<std::string, fieldproxy> Luaproxy<test>::fields=std::map<std::string, fieldproxy>();
显式构造函数似乎说服 gcc 有效地发出变量。我向#gcc 寻求澄清,但不幸的是,该 channel 始终保持沉默。

关于c++ - "undefined reference"到静态字段模板特化,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8628314/

10-08 22:09