我的理解是,专门化的声明或typedef应该导致模板类被实例化,但这似乎不会发生在gcc中。例如。我有一个模板类,模板类Foo {};
我写
class Foo<double>;
或
typedef Foo<double> DoubleFoo;
但在编译之后,生成的目标文件的符号表不包含Foo的成员。
如果我创建实例:
Foo<double> aFoo;
然后当然符号都是生成的。
有没有其他人经历过这个和/或有解释?
答案 0 :(得分:6)
显式实例化的语法是
template class Foo<double>;
见C ++03§14.7.2。
希望函数生成和链接,但在创建但不使用实例(最小的隐式实例化)之后不被剥离,这是一场赌博。
答案 1 :(得分:0)
您正在谈论隐式实例化。但只有当类类型的完整性会影响程序的语义时才会发生这种情况。
在您的情况下,类类型不需要完整,因为您的typedef类型可能保持不完整(不需要类主体,因此不需要实例化它)。为了说明,您也可以在自己的语句中说typedef class MyFunnyThing type;
,而无需在任何地方定义该类。
如果创建一个对象,则必须完成它的类型,然后隐式实例化类模板。请注意,类模板的隐式实例化不会隐式实例化成员函数或静态数据库定义,除非它们在其他地方明确使用。
另外,要声明类模板的特化,整点是阻止实例化,告诉编译器“不实例化,因为后来我明确专门化了“。声明,如果你的专业化也错过了它前面的template<>
。