只是一些代码示例[不是现实生活中的例子]
// at file scope
template <typename T, typename U>
struct demo{};
template class demo<int, int>; // is the template keyword optional here?
Run Code Online (Sandbox Code Playgroud)
第3行中的模板关键字是可选的吗?我之前没有(经常)看到过这种模板关键字的用法.该标准的哪一部分允许这样做?
编辑
我认为g ++有一个bug.
template <typename T, typename U>
struct demo{};
class demo<int, int>; // template keyword omitted
Run Code Online (Sandbox Code Playgroud)
编译g ++(4.5.1)而在Comeau上失败
"ComeauTest.c", line 5: error: specializing class "demo<int, int>" without
"template<>" syntax is nonstandard
class demo<int, int>;
Run Code Online (Sandbox Code Playgroud)
Pot*_*ter 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
是可选的,我不会感到惊讶.但是,我也不会惊讶地发现它是必需的,也不会遗漏它.