有人可以告诉我如何修复下面的语法问题吗?
#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中调用它)?
答案 0 :(得分:3)
正如评论中已提到的,您在此处不需要typename
。但要更详细地解释一下:
你可能写了typename Get<Is>::type::num
,因为你知道如果你引用Get<Is>::type
,你需要把typename
放在它前面。这通常是正确的,但并非总是如此。在某些情况下,语法已经清楚地表明type
被用作类型,而不是表达式,在这种情况下,您不需要typename
,在这种情况下,您通常< em>无法使用typename
。
当您编写Get<Is>::type::num
时,type
已被假定为某种类型。将typename
放在它前面表示您希望将num
视为一种类型。你不这样做,所以不要写typename
。