0

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

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

4

1 回答 1

1

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

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

出于这个原因,通常的做法是在头文件中实现函数模板或类模板的成员函数。

如果您想将类模板的定义与其实现分开,另一种方法是在头文件的底部包含实现文件。这颠倒了典型的包含方法。为了更清楚地说明这一点,通常使用.tpp扩展名(t用于模板)来命名实现文件。这使得哪些文件包含哪些文件更加明显。

于 2013-04-09T17:17:53.187 回答