我有一个像
这样的简单模板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; ?
答案 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 {};
^
当模板中存在模糊语句时,编译器只需要这些关键字。否则,您无法放置这些关键字。