我正在学习如何使用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:找不到公共符号;档案成员将无法访问
为什么工具在功能与功能模板方面的表现不同?
答案 0 :(得分:2)
由于它们是模板化函数,因此在实际实例化模板函数之前,函数本身不会被编译。
例如,我只是将以下代码放在我的一个.cpp
文件中而不使用它,并且.cpp
文件的编译工作正常(尽管语法错误):
template <typename J>
int foobar(J junk)
{
#pragma message("Compiling foobar")
ppp = 35;
return 0;
}
直到我尝试使用以下命令编译它(即创建它的编译器实例):
int main(void)
{
double x;
int y = foobar(x);
return 0;
}
我是否收到编译错误。
: error C2065: 'ppp' : undeclared identifier
自己尝试一下,它可以帮助您解释您所看到的内容(至少在您提到的第一种情况下没有错误。)