我正在学习如何使用Visual Studio 2010创建库 . 因此,为了测试多个符号,我只是写了 -
add.cpp
template <typename T>
T fooBar(T a1, T a2)
{
return (a1+a2);
}
subtract.cpp
template <typename T>
T fooBar(T a1, T a2)
{
return (a1-a2);
}
据我所知,模板是一个编译时的概念 . 为了测试工具在函数/函数模板之间的行为,我写了上面的内容 . 它成功创建了 .lib
,即使在为功能模板设置的最高级别也没有任何警告 . 但是,如果是正常功能,它会发出警告 .
add.obj:警告LNK4006:“int __cdecl fooBar(int,int)”(?fooBar @@ YAHHH @ Z)已在subtract.obj中定义;第二个定义忽略add.obj:警告LNK4221:找不到公共符号;档案成员将无法访问
为什么工具在功能与功能模板方面的表现不同?
1 回答
由于它们是模板化函数,因此在实际实例化模板函数之前,函数本身不会被编译 .
例如,我只是将以下代码放在我的一个
.cpp
文件中而不使用它,并且.cpp
文件的编译很顺利(尽管语法错误):直到我尝试编译它(即创建它的编译器实例),然后:
我收到编译错误 .
自己尝试一下这可能会帮助你解释你所看到的内容(至少在你提到的第一种情况下没有错误 . )