将模板类与非模板类放在同一个cpp文件中时链接错误 - C ++

时间:2014-02-19 21:55:29

标签: c++ linker-errors template-classes

当我在同一个.cpp文件中包含模板化和非模板化类时,我遇到了链接时问题。

我浏览了C ++ FAQ 35.13,35.14,35.15并没有解决问题。

http://www.parashift.com/c++-faq-lite/separate-template-class-defn-from-decl.html

我正在使用Xcode 5和clang。

这是示例

barfoo.h

class bar{
public:
   void barfunc();
};

template <class T>
class foo{
public:
   void foofunc();
};

这是cpp文件:

barfoo.cpp

void bar::barfunc(){...my code...}
template <class T>
void foo<T>::foofunc() {...my code...}
//I also put a instance of template class foo in the .cpp file
template class foo<int>;
//But is still generates the link error

错误是

  

clang:错误:链接器命令失败,退出代码为1(使用-v查看调用)

但是当我删除bar类时,错误消失了,有人能告诉我它为什么会产生这个错误吗?

将定义放在头文件中可以解决问题,但它可能会导致另一个代码膨胀的问题,是否有人可以提供其他解决方案?

1 个答案:

答案 0 :(得分:1)

我发现了问题,问题是我没有将模板类实例化为我在代码中使用的类型。

这是解决模板实例化问题的解决方案:

  
      
  1. 将定义放在头文件中,以便编译器获得实例信息。 (缺点,增加加载和编译时间)

  2.   
  3. 实例化代码中使用的所有类型

  4.