模板链接错误
template linking error
我有一个标题,在这里我放置了函数模板的定义:
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)
相关文章:
- Netbeans 10:错误:链接器命令失败,退出代码为 1(使用 -v 查看调用)
- CMake 错误:链接器命令失败,退出代码为 1 和 cpp.o 文件
- clang:错误:链接器命令失败,退出代码为 1(使用 -v 查看调用) - 体系结构的未定义符号 x86_64:
- 如何修复 clang: 错误:链接器命令失败,退出代码为 1(使用 -v 查看调用)
- Android NDK.Build命令失败.未定义的引用.clang++:错误:链接器命令失败,退出代码为1
- 使用cmake错误链接boost日志
- 错误:链接器命令失败,退出代码为 1(使用 -v 查看调用):在 Macbook 上
- C++ XCODE ld:找不到体系结构x86_64 clang 的符号:错误:链接器命令失败,退出代码为 1(使用 -
- clang:错误:链接器命令失败,C++代码中的退出代码为 1(使用 -v 查看调用)
- 静态库中的 g++ 错误链接函数
- 未定义的参考错误链接天然函数Android
- C++编译错误:ld:找不到体系结构x86_64 clang 的符号:错误:链接器命令失败,退出代码为 1(使用 -v
- QT Q_PROPERTY错误:链接器命令失败,退出代码为 1(使用 -v 查看调用)
- ld:找不到体系结构x86_64 clang 的符号:错误:链接器命令失败,退出代码为 1(使用 -v 查看调用)
- OSX MOJAVE -LD:架构X86_64 clang找不到符号:错误:链接器命令失败,出口代码1
- C 错误链接器命令失败了出口代码1(使用-V查看调用)
- LD:架构x86_64 clang找不到符号:错误:链接器命令失败,出口代码1(使用-v to See
- 聚输出错误 - 链接列表
- Xcode链接器错误:链接器命令失败,退出代码为1(使用-v查看调用)
- 尝试构建C DLIB示例无法与数百个未定义的参考错误链接