在xcode中构建错误

时间:2013-04-09 17:14:29

标签: c++ xcode build linker

我有一个主要功能,如下所示:

#include <vector>
#include "mins_ndim.h"
#include "ObjectiveFunction.h"

int main (int argc, char * const argv[]) {

  ObjectiveFunction objective;
  Frprmn<ObjectiveFunction> frprmn(objective);
  std::vector<double> p(2);
  p[0]=7; p[1]=3;
  frprmn.eat();
}

但这给了我错误:

Undefined symbols:
  "Frprmn<ObjectiveFunction>::eat()", referenced from:
      _main in main.o
ld: symbol(s) not found
collect2: ld returned 1 exit status

eat()列在mins_ndim.h中的Frprmn的结构定义中,并在mins_ndim.cpp中定义。如果我在mins_ndim.h中定义它,那么我不会收到此错误。我认为这与链接有关,但我不知道如何让xcode对其进行排序?!

1 个答案:

答案 0 :(得分:1)

类模板的成员函数的定义在使用时必须对编译器可见。当编译器遇到frprmn.eat();时,它没有看到eat的实现(它只看到了mins_ndim.h中的声明),因此无法生成相应的代码。

请记住,模板本质上是一段代码,编译器必须使用适当的模板参数替换模板类型进行实例化。编译器需要能够看到eat的实现,以便能够以ObjectiveFunction作为模板参数来生成它。

通常的做法是在头文件中实现类模板的函数模板或成员函数。

另一种方法是,如果要保持类模板的定义及其实现是分开的,则将实现文件包含在头文件的 bottom 中。这颠倒了典型的包含方法。为了更清楚,通常将实现文件命名为.tpp扩展名(t用于模板)。这使得哪些文件包括哪些文件更加明显。