首页 文章

具有多个模板定义的库

提问于
浏览
2

我正在学习如何使用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 回答

  • 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
    

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

相关问题