考慮下面的代碼:typename,類型成員和非類型成員:它是有效的代碼嗎?
struct S {
struct type {};
type type;
};
int main() {
typename S::type t;
(void) t;
}
除了一個事實,即是遠不是一個好主意,我看了這裏SO另一個問題後進行試驗。
我發現上面的代碼片段是compiled with no errors by GCC,它是rejected by clang 3.9,出現以下錯誤:
error: typename specifier refers to non-type member 'type' in 'S'
我懷疑鐺就在這種情況下,和GCC是錯誤的(實際上,我打開一個問題的後者)。
這是正確的結論還是typename
的有效使用?
注:我不是問如何解決它,我知道如何做到這一點。我只問這個代碼是否有效。
較舊的gcc像4.4.7拒絕它太:http://melpon.org/wandbox/permlink/Oh2Rp4jWjGPIoIwv – marcinj
Couldn」在標準中找到關於這種合法性的任何東西。儘管如此,'typename'只是在模板方面提到的,所以也許這是一種違背精神的行爲?無論如何,解決這種特定歧義的正確和標準方法似乎是'struct S :: type t;' – StoryTeller
@marcinj這似乎是因爲GCC 4.4.7沒有在外部實現[CWG 382:允許'typename' (http://wg21.link/cwg382)。 – cpplearner