C++ 在xcode中生成错误

C++ 在xcode中生成错误,c++,xcode,build,linker,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>

我有一个主函数,它如下所示:

#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();
}
#包括
#包括“mins_ndim.h”
#包括“ObjectiveFunction.h”
int main(int argc,char*const argv[]{
目的功能目标;
Frprmn Frprmn(目标);
std::载体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
未定义的符号:
“Frprmn::eat()”,引用自:
_主音中的主音
ld:找不到符号
collect2:ld返回了1个退出状态

eat()
列在
mins\u ndim.h
中Frprmn的结构定义中,并在
mins\u ndim.cpp
中定义。如果我在
mins\u ndim.h
中定义它,那么我不会得到这个错误。我想这与链接有关,但我不知道如何让xcode来整理它

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

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

因此,通常在头文件中实现函数模板或类模板的成员函数


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

带有main的文件看不到
mins\u ndim.cpp
,因此如果在那里定义
eat()
,则会得到一个未定义的符号。那么如何使用在.cpp文件中定义的函数呢?该函数列在头文件中,因此我认为它应该是可访问的。因此,如果我使用类模板,则无法将实现和声明保存在单独的文件中(对于非模板类,我倾向于这样做)?@tiswas不是我在上一段中描述的小技巧,不可以。模板实现必须包含在任何想要使用它们的文件中。只是声明不行。