gpt4 book ai didi

c++ - 模板类的成员函数模板与模板类的成员函数的区别

转载 作者:太空宇宙 更新时间:2023-11-04 12:07:46 28 4
gpt4 key购买 nike

代码 1:

template <class T>
class cat{
public:
T a;
void show(){
cout << a ;
}
};

代码 2:

template <class T>
class dog{
public:
T a;
template <class U> // making show function template
void show(){
cout << a ;
}
};


所以 cat::show() 是一个模板类的成员函数。
dog::show() 是模板类的成员函数模板。

问题:
1) 类模板 cat 和 dog 之间有什么区别,而不是当我调用成员函数 show 时,我必须明确指定 U 作为 dog 模板类的实例吗?
2) 编译器是否以相同的方式处理它们。例如 cat::show() 在我使用它之前不会被编译。我猜 dog::show(); 也是一样。那么我在这里缺少什么吗?

最佳答案

这两者的关联方式与此处两个自由函数 foo 的关联方式相同:

void foo() {};
template <typename T>
void foo() {}

作为模板类的成员时,两者都将根据隐式实例化的需要进行实例化。另一方面,如果显式实例化模板类,编译器会生成非模板函数,但不会生成模板成员函数。

除此之外,通常的注意事项:模板函数将只匹配精确类型,而非模板函数将允许隐式转换:

template <typename T>
struct tmpl {
void foo( T, T ) {}
template <typename U>
void bar( U, U ) {}
};
tmpl<int> t;
t.foo( 5, 1. ); // fine, will convert 1. from double to int
t.bar( 5, 1. ); // error

以及模板化函数和非模板化函数之间的所有其他差异。


我真的不明白的是为什么这让你如此困惑。您似乎正在将实例化 视为函数的唯一属性,但事实并非如此。真正困扰你的是什么?为什么您认为模板函数和非模板函数相同

特别是,我觉得您在实现细节上浪费了太多精力。在大多数情况下,是否实例化模板类的一个或所有成员函数并不真正影响程序的语义,如果您的程序需要成员函数,那么编译器会为它生成代码,如果你的程序不需要它,它是否生成代码没有区别(考虑链接器可以删除任何符号,成员函数从未生成或被链接器删除有什么区别?)

关于c++ - 模板类的成员函数模板与模板类的成员函数的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11270247/

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