我们有以下类定义
template<typename T>
class Klass {...}
我们还有以下两个实例
Klass<int> i;
Klass<double> d;
C++ 编译器生成了多少个 Klass 方法的副本? 有人可以解释一下吗?谢谢!
Klass
不是类型,因此谈论 Klass
的方法没有意义。 Kalss<int>
是一种有自己方法的类型,Klass<double>
也是如此。在您的示例中,每种类型都有一组方法。
编辑在现实生活中,事情并不是那么简单。这些方法实际存在的问题还取决于其他因素,请参阅@KerrekSB对此问题的回答。
每个模板实例都是一个完全独立、独特且独立的类型。但是,只有在给定模板实例化实际使用成员函数时,才会生成类模板成员函数的代码(除非您为某些参数集显式地实例化模板)。除此之外,这意味着如果某些类模板成员函数的 body 对于给定的模板参数实际上没有意义,那么只要不调用该成员函数,您仍然可以使用整个模板,因为成员函数的代码永远不会被编译。
另请记住,模板可以专门化:
template <typename T> struct Foo {
int bar;
void chi();
};
template <> struct Foo<int> {
double bar(bool, char) const;
typedef std::vector<bool> chi;
bool y;
};
如您所见,在您看到要讨论的实际实例之前,您无法仅从模板本身看出很多内容。