2012-09-11 61 views
4

之後,但在定義和聲明中使用decltype不匹配。下面是一些代碼:與成員函數的定義我使用decltype的成員函數的返回類型聲明

template<typename T> 
struct A { 
    T x; 
    auto f() -> decltype(x); 
}; 

template<typename T> 
auto A<T>::f() -> decltype(x) { 
    return this->x; 
} 

int main() {} 

這將產生

test.cc:10:6: error: prototype for 'decltype (((A<T>*)0)->A<T>::x) A<T>::f()' does not match any in class 'A<T>' 
test.cc:6:7: error: candidate is: decltype (((A<T>*)this)->A<T>::x) A<T>::f() 

的不同之處在於定義有(A<T>*)0在聲明有(A<T>*)this。是什麼賦予了?

+0

你使用什麼編譯器? –

+1

什麼'A :: x'而不只是'x'說。不過,我不知道它是否有效,或者是否應該如此。 –

+0

@ChristianRau實際上,這是我在gcc解決此問題之前實施的解決方案。 – Bakkot

回答

8

這是GCC 4.7,我這裏報告了一個錯誤:bug #54359(見bug報告的底部)。這個特殊情況被gcc 4.6接受。

作爲一種解決方法,不使用後返回類型和直接使用構件x的類型。在這個例子中,這只是T,但您也可以轉換更復雜的案例。例如,你可以轉換:

T x; 
auto f() -> decltype(x.foo); 

分爲:

T x; 
decltype(std::declval<T>().foo) f(); 

std::declval是非常有用的在這裏。