关于函数模板的c++

C++ about function templates

本文关键字:c++ 函数模板      更新时间:2023-10-16

由于我在模板上挣扎了2个小时,让我们考虑这些文件:

ChildrenOfBodom.h:

#include<iostream>
using namespace std;
void AreYouDeadYet(string);
template<typename T1>void InYourFace(T1);

ChildreOfBodom。答:

#include"ChildrenOfBodom.h"
void AreYouDeadYet(string s){
  InYourFace(s);
}
template<typename T1>void InYourFace(T1 t1){
  cout << t1 << endl;
}

主要。答:

// 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)中编写函数,

主要。答:

#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函数,包括成员函数,必须完全写在头文件中。

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

你的老师是对的。模板必须在头文件中。

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