2014-01-05 64 views
1

當我using SFINAE with functions/function members在下列方式:克++汽車和類型名稱關鍵字

#include <type_traits> 
#include <iostream> 

#include <cstdlib> 

struct X {}; 

struct A 
{ 

    template< typename T > 
    auto 
    f(T && x) 
    -> std::enable_if< std::is_same< T, X >::value >::type 
    { 
     return x; 
    } 

}; 

int main() 
{ 
    return EXIT_SUCCESS; 
} 

我得到一個錯誤:

main.cpp:14:8: error: expected type-specifier 
    -> std::enable_if< std::is_same< T, X >::value >::type 
     ^
main.cpp:14:8: error: expected initializer 

這樣,我應該在前面加上推動者與typename關鍵字。但是這裏根本沒有含糊之處:因爲我現在只在->之後鍵入預期。另一個想法是Qt Creator的typename關鍵字在這種情況下。

這是G ++錯誤?或者在C++ 11中有關於此類上下文的聲明typename

+2

可能的重複[哪裏和爲什麼我必須把「模板」和「typename」關鍵字?](http://stackoverflow.com/questions/610245/where-and-why-do-i-have -to-put-the-template-and-typename-keywords) –

+0

@DanielFrey我在http://stackoverflow.com/questions/610245/找不到類似的上下文。 – Orient

回答

6

無論何時訪問依賴類型名稱(嵌套在依賴於模板參數的表達式中的類型名稱),都需要使用typename關鍵字。在這種情況下,我敢肯定你是對的,沒有歧義,但如果我沒有記錯的話,這就是語言的定義。

希望這會有所幫助!

+0

作爲一個例外的基類說明符,那裏不需要'typename'。 –

5

But there are no ambiguities here at all: as I now only type expected after ->

這並不是真的如何工作。

同樣,只有一個類型,預計在以下聲明:

T::some_member x; 

,但你仍然需要typenameT依賴,爲了滿足編制的某些階段。

編譯器不知道這是一個聲明(決定它是否是有效的前),直到它可以看到你有一個->隨後一個類型。所以如果它不知道你有一個類型,它不知道「沒有歧義」。這是一個雞與雞蛋的問題。