gpt4 book ai didi

C++ 关于函数模板

转载 作者:太空宇宙 更新时间:2023-11-04 05:40:36 25 4
gpt4 key购买 nike

自从 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;
}

main.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 中),

main.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 写的内容 ( here ),

BlockquoteTemplates functions, including member functions, must be written entirely in headers.

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

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

最佳答案

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

查看这个问题:Why can templates only be implemented in the header file?

关于C++ 关于函数模板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17115835/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com