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

时间:2011-04-24 06:52:32

标签: c++ templates

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

// 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>; 

1 个答案:

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