C ++中的模板类

时间:2012-05-12 22:36:42

标签: c++ templates compiler-construction

我们有以下课程定义

template<typename T>
class Klass {...}

我们还有两个实例

Klass<int> i;
Klass<double> d;

C ++编译器生成了多少个Klass方法? 有人可以解释一下吗?谢谢!

2 个答案:

答案 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;
};

正如您所看到的那样,在您看到将要讨论的实际实例之前,您无法从模板中分辨出很多内容。