2012-07-26 1 views
0

가능한 중복 :
Why is it an error to use an empty set of brackets to call a constructor with no arguments?
Most vexing parse: why doesn't A a(()); work?복사 작업이 종료 된 후 잘못된 개체가 발생 했습니까?

이 하나가 나에게 화를 가져옵니다. 어쩌면 너무 단순합니다.

struct Foo 
{ 
    Foo() {} 
    Foo(const Foo& f) {} 
    void work() {} 
}; 

int main() 
{ 
    Foo f(Foo()); 
    f.work(); 
} 

GCC 4.6이 날 제공 :

error: request for member ‘work’ in ‘f’, which is of non-class type ‘Foo(Foo (*)())’ 

유효 코드처럼 보일 수 있습니다 복사 작업의 생략 후 :

int main() 
{ 
    Foo f; 
    f.work(); 
} 

하지만 난 work()를 호출 할 수없는 이유?

편집 :

예 (아래 참조). 이 증상의 원인이 내가 예상하지 못했던 곳이기 때문에 먼저 검색 할 때 원래 게시물을 찾지 못했습니다.

+1

왜'Foo f (Foo());'라고 써야할까요? 처음에는'Foo f;'를 쓰면 무엇이 잘못 되었습니까? 첫 번째 버전은 오류 메시지에서 볼 수있는 것과 완전히 다른 유형을 만듭니다. – Nobody

+0

물론 약간 학문. 어떤 생성자가 호출되는지 연구에서 유래했습니다. – ritter

답변

3

Foo f(Foo());은 함수 선언이므로.

난 당신이 원하는 생각 :

Foo f((Foo())); 
+0

기본 블록 내에서 함수 선언이 허용되지 않습니다. 어떻게 해석 될 수 있습니까? – ritter

+0

@ 프랭크 : 여기 좀보세요 : http://stackoverflow.com/questions/1424510/most-vexing-parse-why-doesnt-aa-work – Andrew

+0

사실이 함수는 다음과 같이 쓸 수 있습니다 :'int bar (int a, int b);'. 컴파일 할 것입니다 – Andrew

1

f는 효과적으로 주요 기능 내에서 함수 선언이다 :

또는 경우에 Foo f;가 복사-구조 싶다.

Foo f((Foo())); // to make the definition of f explicit enough. 
1

n3337 8.2

함수 스타일 캐스트도 선언의 맥락 에서 발생할 수있는 6.8에 언급 된 선언 사이의 유사성에서 발생하는 모호성을 시도 . 이 컨텍스트에서 매개 변수 이름 주위에 중복 된 괄호 세트가있는 함수 선언과 함수 스타일의 캐스트가있는 객체 선언이 이니셜 라이저로 선택됩니다. 6.8에서 언급 된 모호성과 마찬가지로, 결의는 선언 일 수있는 모든 구성을 고려하는 것입니다. [참고 : 은 명시 적으로 비 기능 스타일 캐스트에 의해 명확 해지며, =는 초기화를 나타내거나 매개 변수 이름 주위의 중복 된 괄호를 제거하여 나타낼 수 있습니다. - 최종 주] [예 :

struct S { 
S(int); 
}; 
void foo(double a) { 
S w(int(a)); 
//function declaration 
S x(int()); 
//function declaration 
S y((int)a); 
//object declaration 
S z = int(a); 
//object declaration 
} 

- 엔드 예]

1

C++ 파서 즉 서명 Foo(Foo(*)())와 함수 선언, 푸 반환하는 함수과는 복용 Foo f(Foo()); 식 해석 Foo를 반환하는 함수에 대한 함수 포인터.인수를 둘러싼 명시적인 괄호를 추가하면 Foo f((Foo()));과 같이 모호성이 해결됩니다. 그러나 실제로 중복 코드를 피하는 Foo f;을 수행하는 것을 고려하십시오.

+0

기본 블록 내에서 함수 선언이 허용되지 않습니다. 어떻게 해석 될 수 있습니까? – ritter

+0

@ 프랭크 그게 C 레거시 [링크] (http://stackoverflow.com/questions/6089452/is-there-a-use-for-function-declarations-inside-functions) –

+0

오, 좋아! 감사! – ritter

관련 문제