2012-09-11 5 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() {} 

이 선언이 (A<T>*)this을 가지고 어디에 정의가 (A<T>*)0을 가지고있는

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() 

의 차이를 생산하고 있습니다. 뭐라 구요?

+0

어떤 컴파일러를 사용하고 있습니까? –

+1

단지'x' 대신'A :: x'가 무엇을 말하는가? 나는 그것이 작동하는지 또는 그것이 그렇게되어야 하는지를 모른다. –

+0

@ChristianRau 그게 실제로 작동하고, 지금 gcc가 수정하기 전까지 구현 한 솔루션입니다. – Bakkot

답변

8

이것은 내가보고 한 gcc 4.7의 버그입니다 : bug #54359 (버그 보고서 맨 아래 참조). 이 특별한 경우는 gcc 4.6에서 허용됩니다.

임시 해결책으로 후행 반환 유형을 사용하지 말고 구성원 유형 x을 직접 사용하지 마십시오. 이 예에서는 간단히 T이지만 더 복잡한 경우도 변환 할 수 있습니다. 예를 들어, 변환 할 수 있습니다

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

속으로 :

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

std::declval 여기에 매우 유용합니다.