具有多个模板定义的库

Library with multiple template definitions

本文关键字:定义      更新时间:2023-10-16

我正在学习如何使用Visual Studio 2010创建库。所以为了测试多个符号,我只是写了——

添加.cpp

template <typename T>
T fooBar(T a1, T a2)
{
  return (a1+a2);
}

减去.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) 已在 subSupplement.obj 中定义;第二个定义已忽略

add.obj : 警告 LNK4221:未找到公共符号;存档成员将无法访问

为什么该工具对函数与函数模板的行为不同?

由于它们是模板化函数,因此在实际实例化模板函数之前,函数本身不会被编译。

例如,我只是将以下代码放在我的一个.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  

自己尝试一下,它可能会帮助你解释你所看到的(至少在你提到的第一种情况下没有错误)。