typename和scope运算符的语法错误

时间:2015-08-31 17:28:42

标签: c++ templates c++11

有人可以告诉我如何修复下面的语法问题吗?

#include <iostream>

template <int N>
struct Thing { 
    static const int num = N;
};

template <int N>
struct Get {
    using type = Thing<N>;
};

template <int... Is>
void foo() {
//  int a[] = {(std::cout << Thing<Is>::num << '\n', 0)...};  // This compiles.
    int a[] = {(std::cout << typename Get<Is>::type::num << '\n', 0)...};  // This does not.
}

int main() {
    foo<0,1,2>();
}

GCC 5.1.0说[错误]预期'('之前'&lt;&lt;''令牌。任何快速解决方法(没有编写新函数并在foo中调用它)?

1 个答案:

答案 0 :(得分:3)

正如评论中已提到的,您在此处不需要typename。但要更详细地解释一下:

你可能写了typename Get<Is>::type::num,因为你知道如果你引用Get<Is>::type,你需要把typename放在它前面。这通常是正确的,但并非总是如此。在某些情况下,语法已经清楚地表明type被用作类型,而不是表达式,在这种情况下,您不需要typename,在这种情况下,您通常< em>无法使用typename

当您编写Get<Is>::type::num时,type已被假定为某种类型。将typename放在它前面表示您希望将num视为一种类型。你不这样做,所以不要写typename