2

我们有以下类定义

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

我们还有以下两个实例

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

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

4

2 回答 2

6

KlassKlass不是类型,所以谈论' 方法是没有意义的。Kalss<int>是一个有自己方法的类型,Klass<double>. 在您的示例中,每种类型都有一组方法。

在现实生活中编辑,并不是那么简单。方法的实际存在问题还取决于其他因素,请参阅@KerrekSB 对此问题的回答。

于 2012-05-12T22:38:45.693 回答
6

每个模板实例都是一个完全独立的、独特的和独立的类型。但是,仅当成员函数实际用于给定模板实例化时才会生成类模板成员函数的代码(除非您为某些参数集显式实例化模板)。除此之外,这意味着如果某些类模板成员函数的主体对于给定的模板参数实际上没有意义,那么只要不调用该成员函数,您仍然可以使用整个模板,因为代码成员函数永远不会被编译。

还要记住,模板可以是专门的:

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

如您所见,在您看到将要讨论的实际实例化之前,您无法仅从模板本身中分辨出很多东西。

于 2012-05-12T22:44:02.550 回答