我的理解是,专业化的声明或typedef应该使模板类实例化,但这似乎并没有出现在gcc中。例如。我有一个模板类,模板类Foo {};显式模板实例化的gcc问题?
我写
class Foo<double>;
或
typedef Foo<double> DoubleFoo;
但编译后生成的目标文件的符号表不包含富的成员。
如果我创建一个实例:
Foo<double> aFoo;
那当然符号全部产生。
有没有其他人经历过这个和/或有解释?
我的理解是,专业化的声明或typedef应该使模板类实例化,但这似乎并没有出现在gcc中。例如。我有一个模板类,模板类Foo {};显式模板实例化的gcc问题?
我写
class Foo<double>;
或
typedef Foo<double> DoubleFoo;
但编译后生成的目标文件的符号表不包含富的成员。
如果我创建一个实例:
Foo<double> aFoo;
那当然符号全部产生。
有没有其他人经历过这个和/或有解释?
为显式实例的语法
template class Foo<double>;
见C++ 03§14.7.2。
希望函数得到生成和链接,但在创建但不使用实例(最小的隐式实例化)后不会被剥离,这是相当大的赌博。
您正在谈论隐式实例化。但是,只有当类类型的完整性会影响程序的语义时才会发生这种情况。
在你的情况下,类的类型不需要是完整的,因为你typedef的类型可以保持不完整(不需要类体,所以不需要实例化它)。为了说明,你也可以在自己的声明中说typedef class MyFunnyThing type;
,而不必在任何地方定义该类。
如果你创建一个对象,它的类型必须完整,所以类模板被隐式地实例化。请注意,类模板的隐式实例化不会隐式地实例化成员函数或静态数据块定义,除非它们在别处明确使用。
此外,声明一个类模板的专业化,整点是防止的实例发生,告诉编译器“不要实例,因为后来我明确专攻它”。声明如果你的专业化也没有在它前面的template<>
。
我认为Potatoswatter是在这里的东西。我从来没有听说过typedef的这种用法。这仅适用于shorthanding类型,并且从不实例化任何内容。 – daramarak 2010-04-29 16:16:03
是的,你是对的,我不确定我在哪里找到有关typedefs的错误信息。我的声明正处于正确的轨道上,但没有提供关键的“模板”关键字。 谢谢 – 2010-04-29 16:22:35