1

我收到以下代码的链接器错误(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();
}
4

1 回答 1

0

C++ 编译器需要查看模板定义才能执行隐式实例化。这意味着,如果 C++ 编译器在您调用它时知道实现,则它只能为模板函数调用自动生成目标代码。

但是,您可以改用显式实例化。这意味着您要求编译器为您指定的模板的特定实例生成 C++ 代码。然后,当模板用于main.cpp.

//a.cpp

#include "a.h"

template<typename T> T foo( DWORD bar )
{
    return T();
}

template int foo<int> (DWORD); // explicit instantiation
于 2013-08-28T19:20:41.867 回答