"class"关键字之前的"template"关键字是什么?

Pra*_*rav 7 c++ templates

只是一些代码示例[不是现实生活中的例子]

// 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是可选的,我不会感到惊讶.但是,我也不会惊讶地发现它是必需的,也不会遗漏它.

  • @Prasoon:不,为什么会这样? (3认同)
  • @David:原始答案解释了显式实例化*是*,以及什么时候关键字是可选的?"虚假细节"?WTF? (2认同)
  • @David:所以,只说"关键字不是可选的"是一个很好的答案,但"他非常了解的虚假细节"正在采取一种态度?对不起,我不是买这个哲学. (2认同)