模板链接错误

template linking error

本文关键字:错误 链接      更新时间:2023-10-16

我有一个标题,在这里我放置了函数模板的定义

template <typename FT, typename std::enable_if< !std::is_array<FT>::value, int >::type =0 >
int fieldRW(lua_State* l, FT* ptr, bool write){ return scalarFieldRW<FT>(l, ptr, write); }

在.cpp单元中,我得到一个指向该模板函数的指针,我希望编译器实例化该模板:

typedef int (*_fieldRW)(lua_State*, void*, bool);
int dummy=3;
_fieldRW aFunctionPointer=_fieldRW(fieldRW<decltype(dummy)>);

一切都在编译。但我得到以下链接时间错误:

/home/pisto/sorgenti/hopmodv4/src/fpsgame/server.cpp:39:未定义引用`int fieldRW(lua_State*,int*,bool)'

请注意,编译器正确地选择了头中定义的模板(因为它添加了模板的默认第二个参数),但显然它未能实际实例化模板。

编辑:这看起来绝对像个bug。请参阅以下测试:http://pastebin.com/5Yjsv47H此外,这可能是g++中的一个错误的另一个线索是,如果我这样做:

int main() {
        int dummy=3;
        int (*inted)(int*)=asd<decltype(dummy)>;
        int (*voided)(void*)=(int (*)(void*))asd<decltype(dummy)>;
        voided(&dummy);
}

g++对未使用的变量CCD_ 1发出警告,但进行了精细编译。

答案可能是函数指针转换规范中的一个微妙之处:

该标准在[expr.relinterpret.cast]中说明"函数指针可以显式转换为不同类型。通过指向与定义中使用的类型不同的函数类型(8.3.5)的未定义。"

所以我认为这个程序有未定义的行为。因为你从不打电话asd作为有效表达式的一部分,不需要实例化。

Clang++的失败方式与G++4.6相同,但它适用于G++4.7

(感谢Jonathan Wakely)

相关文章: