只是一些代码示例[不是现实生活中的例子]
// at file scope
template <typename T, typename U>
struct demo{};
template class demo<int, int>; // is the template keyword optional here?
第3行的模板关键字是否可选?我之前没有(经常)看到过这种模板关键字的用法。该标准的哪一部分允许这个?
编辑
我认为g ++有一个bug。
template <typename T, typename U>
struct demo{};
class demo<int, int>; // template keyword omitted
编译g ++(4.5.1)而在Comeau上失败
"ComeauTest.c", line 5: error: specializing class "demo<int, int>" without
"template<>" syntax is nonstandard
class demo<int, int>;
答案 0 :(得分:13)
这是显式实例化。
通常,当您使用模板时,编译器会根据您的需要生成所需内容。但是,要在静态或动态库中提供类模板的基本特化,您需要同时生成所有成员,以确保将它们传递给用户。
例如,C ++标准库的大多数实现明确地专门化std::ostream<char,char_traits<char> >
,因为否则应用程序最终会在cout
上包含各种操作的重复副本。
此语法与显式实例化相同。 C ++03§14.7.2/ 2:
显式实例化的语法是:
显式实例:
template
声明
看起来你偶然发现了专门化的过时语法,没有明确地实例化一个类模板。 Comeau警告你,它将template-id声明作为显式特化的前向声明。据推测,海湾合作委员会正在做同样的事情。在这种情况下,您不可能获得明确的实例化。此外,在定义之前使用显式模板特化是未定义的行为。 (从根本上说,隐式特化会导致违反单定义规则。)
请注意,GCC还支持extern
模板实例化:
extern template
声明
在extern函数实例化的情况下,如果template
是可选的,我不会感到惊讶。但是,我也不会惊讶地发现它是必需的,也不会遗漏它。