2010-04-29 55 views
2

我的理解是,专业化的声明或typedef应该使模板类实例化,但这似乎并没有出现在gcc中。例如。我有一个模板类,模板类Foo {};显式模板实例化的gcc问题?

我写

class Foo<double>; 

typedef Foo<double> DoubleFoo; 

但编译后生成的目标文件的符号表不包含富的成员。

如果我创建一个实例

Foo<double> aFoo; 

那当然符号全部产生。

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

回答

6

为显式实例的语法

template class Foo<double>; 

见C++ 03§14.7.2。

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

+1

我认为Potatoswatter是在这里的东西。我从来没有听说过typedef的这种用法。这仅适用于shorthanding类型,并且从不实例化任何内容。 – daramarak 2010-04-29 16:16:03

+0

是的,你是对的,我不确定我在哪里找到有关typedefs的错误信息。我的声明正处于正确的轨道上,但没有提供关键的“模板”关键字。 谢谢 – 2010-04-29 16:22:35

0

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

在你的情况下,类的类型不需要是完整的,因为你typedef的类型可以保持不完整(不需要类体,所以不需要实例化它)。为了说明,你也可以在自己的声明中说typedef class MyFunnyThing type;,而不必在任何地方定义该类。

如果你创建一个对象,它的类型必须完整,所以类模板被隐式地实例化。请注意,类模板的隐式实例化不会隐式地实例化成员函数或静态数据块定义,除非它们在别处明确使用。

此外,声明一个类模板的专业化,整点防止的实例发生,告诉编译器“不要实例,因为后来我明确专攻它”。声明如果你的专业化也没有在它前面的template<>