我使用以下代码收到链接器错误(2001,未解析的外部符号)。它只发生在模板中,我可以用void,int等完美地做同样的事情。
//a.h
template<typename T> T foo( DWORD );
//a.cpp
#include "a.h"
template<typename T> T foo( DWORD bar )
{
return T();
}
//main.cpp
#include "a.h"
void something()
{
int hello = foo<int>( 1 );
}
当我将foo的声明放在头文件中时,它确实有用
//a.h
template<typename T> T foo( DWORD bar )
{
return T();
}
答案 0 :(得分:0)
C ++编译器需要查看模板定义才能执行隐式实例化。这意味着,如果C ++编译器在调用它时知道实现,则它只能自动生成模板函数调用的目标代码。
但是,您可以依赖显式实例化。这意味着您要求编译器为您指定的模板的特定实例生成C ++代码。然后,在main.cpp
中使用模板时,链接时的C ++编译器将能够找到此实现(通过外部链接)。
//a.cpp
#include "a.h"
template<typename T> T foo( DWORD bar )
{
return T();
}
template int foo<int> (DWORD); // explicit instantiation