2009-06-14 7 views
2

아래 코드는 비주얼 C에서 컴파일되지 않습니다 ++ 2005오류 C2228은

class SomeClass { 
public: boost::function<void()> func; 
     SomeClass(boost::function<void()> &func): func(func) { } 
}; 

void someFunc() { 
    std::cout << "someFunc" << std::endl; 
} 

int main() { 
    SomeClass sc(boost::function<void()>(&someFunc)); 
    sc.func(); // error C2228: left of '.func' must have class/struct/union 
    return 0; 
} 

나는 SomeClass 생성자에 인수 주위에 괄호를 넣어 또는 부스트를 구성하는 경우 : : 함수 객체는 잘 컴파일 된 인수 목록 밖에 있습니다.

SomeClass sc((boost::function<void()>(&someFunc))); 
    // or 
    boost::function<void()> f(&someFunc); 
    SomeClass sc(f); 

이전 코드의 문제점은 무엇입니까?

답변

1

함수에 대한 함수 선언은 boost:function <void()>을 참조하고 SomeClass을 반환합니다. 다음과 같은 규칙을 암기 할 수 있습니다.이 규칙은 많은 다른 모호성 제거 사례에 적용됩니다. 이러한 사례에 대한 설명은 C++ 표준의 8.2 섹션에서 찾을 수 있습니다.

가능성이 선언 될 수있는 모든 구조를 선언 수단

로 간주 될 것이며, 다음은 불필요한 괄호

boost::function<void()>(&someFunc) 

하다면, 파라미터 선언으로 간주 될 당신은 괄호를 제거, 이것은 분명해질 것입니다

boost::function<void()> &someFunc 

그리고 따라서, 전체 선언은 더 이상

SomeClass sc(boost::function<void()> &someFunc); 

캐스트 표기법

SomeClass sc((boost::function<void()>)&someFunc); 

를 사용하거나처럼, 전체 표현식 주위에 괄호를 넣어, 그것을 해결하기 위해 개체하지만 함수를 선언하지 않습니다 그랬어.

여기 8.2에서 모든 영광 표준입니다 :

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

int (((((((a))))))) = 3; 
int (*(pa)) = &a; 
에서처럼, 어느 곳에서나 괄호를 소개 할 수 있는지