如果" typename"没有区别用于模板专业化

时间:2016-09-15 13:13:38

标签: c++ templates

我有一个像

这样的简单模板
template <typename a, typename b, typename c> 
class myclass
{

};

我意识到我可以通过以下两种方式专门化模板:

template <typename a, typename b>
class myclass<a, b, int> 
{

};

template <typename a, typename b>
class myclass<a, b, typename int> 
{

};

为什么&#34; typename int&#34;之间没有区别?和&#34; int&#34; ?

1 个答案:

答案 0 :(得分:1)

有,它必须是一个视觉工作室的bug。因为visual studio没有实现两个阶段名称查找,也没有任何依赖类型的方法,所以它允许你编译它而不会出错。但是,使用gcc编译时,您将收到以下错误:

main.cpp:11:33: error: template argument 3 is invalid
class myclass<a, b, typename int>
                    ^

但是当使用依赖名称时,typename关键字必须出现告诉编译器它不是值或类型以外的其他东西。事实上,typename关键字只有在真正需要时才会出现。

但是,有一些上下文,编译器已经知道表达式必须屈服于类型,如继承。如果您尝试将typename放在依赖名称前面,则会出现错误。看看这段代码:

template <typename A>
struct MyType : typename std::decay<A>::type {};

导致该错误:

main.cpp:6:17: error: keyword 'typename' not allowed in this context (the base class is implicitly a type)
 struct MyType : typename std::decay<A>::type {};
                 ^

当模板中存在模糊语句时,编译器只需要这些关键字。否则,您无法放置这些关键字。