显式模板实例化的gcc问题?

时间:2010-04-29 15:53:52

标签: c++ templates instantiation

我的理解是,专门化的声明或typedef应该导致模板类被实例化,但这似乎不会发生在gcc中。例如。我有一个模板类,模板类Foo {};

我写

  class Foo<double>;  

typedef Foo<double> DoubleFoo;  

但在编译之后,生成的目标文件的符号表不包含Foo的成员。

如果我创建实例

Foo<double> aFoo;  

然后当然符号都是生成的。

有没有其他人经历过这个和/或有解释?

2 个答案:

答案 0 :(得分:6)

显式实例化的语法是

template class Foo<double>;

见C ++03§14.7.2。

希望函数生成和链接,但在创建但不使用实例(最小的隐式实例化)之后不被剥离,这是一场赌博。

答案 1 :(得分:0)

您正在谈论隐式实例化。但只有当类类型的完整性会影响程序的语义时才会发生这种情况。

在您的情况下,类类型不需要完整,因为您的typedef类型可能保持不完整(不需要类主体,因此不需要实例化它)。为了说明,您也可以在自己的语句中说typedef class MyFunnyThing type;,而无需在任何地方定义该类。

如果创建一个对象,则必须完成它的类型,然后隐式实例化类模板。请注意,类模板的隐式实例化不会隐式实例化成员函数或静态数据库定义,除非它们在其他地方明确使用。

另外,要声明类模板的特化,整点阻止实例化,告诉编译器“不实例化,因为后来我明确专门化了“。声明,如果你的专业化也错过了它前面的template<>