2015-08-31 60 views
1

有人能告訴我如何解決下面的語法問題嗎?類型名稱和範圍操作符的語法錯誤

#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說[錯誤]預期 '(' 前 '< <' 令牌。有快捷方式解決這一問題(而不需要編寫一個新的功能,並把它foo中的稱呼)?

+4

當然。擺脫'typename'。你沒有訪問嵌套類型,但值 –

+0

啊!很簡單。謝謝。 – prestokeys

+0

因爲然後一個編譯器認爲'num'是一個類型名稱,但它是無效的類型名稱放在一個表達式中,就像你做了 –

回答

3

正如在評論中已經提到的,你不需要typename在這裏,但在稍微詳細地解釋:

你大概寫typename Get<Is>::type::num,因爲你知道,如果你指的Get<Is>::type,你就需要把typename在這是正確的,但並非如此AYS。在某些情況下,語法已經很清楚type被用作類型,而不是表達式,在這種情況下,您不需要typename,在這種情況下,您通常會使用而不是使用typename

當您編寫Get<Is>::type::num時,type已被假定爲一種類型。將typename放在它的前面表示您希望num也被視爲一種類型。你不要,所以不要寫typename

相關問題