-2

由于我与模板斗争了 2 个小时,让我们考虑这些文件:

ChildrenOfBodom.h:

#include<iostream>
using namespace std;

void AreYouDeadYet(string);
template<typename T1>void InYourFace(T1);

ChildreOfBodom.cc:

#include"ChildrenOfBodom.h"

void AreYouDeadYet(string s){
  InYourFace(s);
}

template<typename T1>void InYourFace(T1 t1){
  cout << t1 << endl;
}

主.cc:

// g++ ChildrenOfBodom.cc main.cc
#include"ChildrenOfBodom.h"

int main(){
  AreYouDeadYet("Awesome");

  InYourFace("Awesome");
  int i=8;
  InYourFace(i);
  return 0;
}

在编译时我收到了这条消息:

/tmp/ccN1fClI.o: In function `main':
main.cc:(.text+0x54): undefined reference to `void InYourFace<char const*>(char const*)'
main.cc:(.text+0x65): undefined reference to `void InYourFace<int>(int)'
collect2: error: ld returned 1 exit status

我的直接解决方案是在main.cc(并且仍然在ChildrenOfBodom.cc)中编写函数,

主.cc:

#include"ChildrenOfBodom.h"

template<typename T1>void InYourFace(T1 t1){
  cout << t1 << endl;
}


int main(){
  AreYouDeadYet("Awesome");

  InYourFace("Awesome");
  int i=8;
  InYourFace(i);
  return 0;
}

这行得通。但我想我存储了两次InYourFace(),所以我做了一些搜索,找到了 Tyler McHenry 写的(这里),

BlockquoteTemplates 函数,包括成员函数,必须完全写在头文件中。

所以我做到了。但我想了解,因为我所有的老师都告诉我不要在标题中编写函数。那么在标题中编写模板真的正确吗?或者还有另一种将它们写入 cc 文件的方式,我的意思是与我以前使用的方式不同的方式,因为如果我需要更改模板,这听起来并不高效......当我使用模板 ?在这里我使用了一个stringint所以我猜编译器创建InYourFace(int)并且InYourFace(string)我猜如果我调用main.cc三十次InYourFace(int)它不会创建三十次,InYourFace(int)而是只创建一个并使用它三十次。但是如果我使用InYourFace(int)in ChildrenOfBodom.cc,它是否也会创建InYourFace(int),还是只会为and创建InYourFace(int)一次?main.ccChildrenOfBodom.cc

希望我的问题和我的英语很清楚......

4

1 回答 1

2

你的老师是对的。模板必须在标题中。

看到这个问题:为什么模板只能在头文件中实现?

于 2013-06-14T19:26:05.833 回答