头文件中的C ++模板

时间:2013-08-28 19:04:47

标签: c++ templates

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

1 个答案:

答案 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