由于我与模板斗争了 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 文件的方式,我的意思是与我以前使用的方式不同的方式,因为如果我需要更改模板,这听起来并不高效......当我使用模板 ?在这里我使用了一个string
,int
所以我猜编译器创建InYourFace(int)
并且InYourFace(string)
我猜如果我调用main.cc
三十次InYourFace(int)
它不会创建三十次,InYourFace(int)
而是只创建一个并使用它三十次。但是如果我使用InYourFace(int)
in ChildrenOfBodom.cc
,它是否也会创建InYourFace(int)
,还是只会为and创建InYourFace(int)
一次?main.cc
ChildrenOfBodom.cc
希望我的问题和我的英语很清楚......