【发布时间】:2014-06-26 15:10:50
【问题描述】:
以下最小代码可以在 GNU C++ 中正常编译和链接:
#include <iostream>
// Simple function
template<class T>
void foo(T a,void* = 0) {
std::cout << a << std::endl;
}
// A distpatching class
template<
class T,
void (*Function)(T,void*)
>
class kernel {
public:
// Function dispatcher
template<class M>
inline static void apply(M t) {
Function(t,0);
}
};
int main()
{
kernel<int,foo>::apply(5);
//foo(5,0);
}
但使用 Visual Studio 2008 会产生错误
error LNK2019: Verweis auf nicht aufgelöstes externes Symbol ""void __cdecl foo<int>(int,void *)" (??$foo@H@@YAXHPAX@Z)" in Funktion ""public: static void __cdecl kernel<int,&void __cdecl foo<int>(int,void *)>::apply<int>(int)" (??$apply@H@?$kernel@H$1??$foo@H@@YAXHPAX@Z@@SAXH@Z)".
显然整个函数实现都在那里,但编译器似乎抛弃了foo 函数的实现。如果注释行被激活,则链接器会找到该符号。
我认为(因为 g++ 编译得很好)这是有效代码,所以我想 VS 2008 中存在一些错误,或者我在这里做错了什么?有谁知道这个的解决方法/解决方案?最终代码必须与 Visual Studio 2008 一起使用,并且在实际代码中不可能猜测所有模板类型组合(即,我无法显式实例化所有可用类型的函数:这里只是 T,在实际代码中,最多使用任意类的5个模板参数)。
【问题讨论】:
-
VS2008 是一个非常古老的编译器,考虑到 C++ 目前的发展速度。尝试升级到最新最好的。
-
@Constructor 感谢您的检查!这意味着我的代码原则上是正确的。
-
@TemplateRex 我有其他版本的 VS,但通常是客户决定他们有什么理由必须使用哪个编译器。
-
此代码在 Visual Studio 2008(版本 9.0.30729.1 SP)中运行并打印“5”
标签: c++ templates visual-studio-2008 function-pointers lnk2019