【发布时间】:2012-04-24 20:39:07
【问题描述】:
我正在学习如何使用 Visual Studio 2010 创建库。所以为了测试多个符号,我刚刚写了 -
add.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) 已经在 subtract.obj 中定义;第二个定义被忽略
add.obj:警告 LNK4221:未找到公共符号;存档成员将无法访问
为什么该工具对函数和函数模板的行为不同?
【问题讨论】:
-
你试过检查你出去的
.lib吗? -
你从哪里引用这些函数?令我担心的是,您将这些定义在
.cpp文件中,而不是在.h或.hxx文件中。可能在没有任何警告/错误的情况下创建了.lib,因为您实际上根本没有编译它们。 -
您是否尝试过实例化模板函数,例如,通过编写如下内容: int a;诠释 b; int c = fooBar(a,b); ?否则编译器将永远不会实例化模板并且永远不必在两者之间进行选择。
-
@BjörnPollex 是的。每个源文件都有两行特定的名称修改完成。我不确定要检查多远才能更具体。
-
@Mahesh,我会根据我所说的在下面发布一个答案。
标签: c++ visual-studio-2010 function templates static-libraries