我们有以下课程定义
template<typename T>
class Klass {...}
我们还有两个实例
Klass<int> i;
Klass<double> d;
C ++编译器生成了多少个Klass方法? 有人可以解释一下吗?谢谢!
答案 0 :(得分:6)
Klass
不是一种类型,所以谈论Klass
的方法是没有意义的。 Kalss<int>
是一种具有自己方法的类型,Klass<double>
也是如此。在您的示例中,每种类型都有一组方法。
编辑,并不是那么简单。这些方法的实际存在问题也取决于其他因素,参见@ KerrekSB对这个问题的回答。
答案 1 :(得分:6)
每个模板实例都是一个完全独立,独特且独立的类型。但是,仅当成员函数实际使用用于给定模板实例化时,才会生成类模板成员函数的代码(除非您为某些参数集明确地实例化模板 )。除此之外,这意味着如果某个类模板成员函数的 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;
};
正如您所看到的那样,在您看到将要讨论的实际实例之前,您无法从模板中分辨出很多内容。