关于函数模板的c++
C++ about function templates
由于我在模板上挣扎了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函数,包括成员函数,必须完全写在头文件中。
所以我做了。但是我想要理解,因为我所有的老师都告诉我不要在头文件中写函数。那么,在头中编写模板真的正确吗?或者还有另一种方式将它们写在抄送文件中,我的意思是我之前使用的一种不同的方式,因为如果我需要更改模板,听起来并不是很有效……当我使用模板时,编译器究竟做了什么?这里我使用了string
和int
,所以我猜编译器会创建InYourFace(int)
和InYourFace(string)
,我猜如果我调用main.cc
30次InYourFace(int)
,它不会创建30次InYourFace(int)
,而是只创建一个并使用它30次。但是如果我在ChildrenOfBodom.cc
中使用InYourFace(int)
,它是否也会创建InYourFace(int)
,或者它只会为main.cc
和ChildrenOfBodom.cc
创建一次InYourFace(int)
?
你的老师是对的。模板必须在头文件中。
参见这个问题:为什么模板只能在头文件中实现?
相关文章:
- 当函数模板参数是具有默认参数的类模板时,函数模板参数的推导如何执行
- 将重载的成员函数传递给函数模板
- C++17中函数模板中的静态数组初始化(MSVC 2019)
- 为什么 gcc 和 clang 为函数模板的实例化生成不同的符号名称?
- 具有常量引用参数的函数模板专用化
- std::span<const T> 作为函数模板中的参数
- 如何编写一个完美的缩写函数模板?
- 仅在函数模板中为那些定义了函数的类型执行函数
- 如何在C++中伪造虚拟可变参数函数模板?
- 以下代码中的函数模板有什么问题?
- 在 C++20 中是否不再允许在 std 中对程序定义类型的函数模板进行专用化?
- 将显式实例化的函数模板与转换匹配
- 使用定义函数模板别名
- 函数模板返回类型
- C++有什么方法可以在既不调用函数模板也不提供其模板参数的情况下引用函数模板?
- C++ std::functional 中的可变参数函数模板
- 单行函数模板 c++ 的内联性保证
- C++函数模板需要 &for 数组参数
- 概念解析为使用 std::make_signed_t 时意外的函数模板
- 两个函数模板候选项.将一个参数作为引用后,选择不太专业的模板