2011-02-09 2 views
2

아래의 스 니펫과 유사한 코드를 컴파일하려고합니다.내부 (중첩 된) 구조체에 기본 ctor가 필요한 이유는 무엇입니까?

class System 
{ 
private: 
    struct Configuration 
    { 
     Configuration(/*params*/); 
     Configuration(const Configuration&); 
     Configuration& operator=(const Configuration&); 
     ~Configuration(); 

     /* member variables */ 
    } m_config; 

    explicit System(const Configuration& cfg); 

    // Non copyable constructable, non assignable 
    System(const System&); 
    System& operator= (const System&); 

public: 
    System(); 
    ~System(); 
} 


//Implementation 
System::System() 
{ 
    m_config = Configuration(/*default params*/); 
    // .... 
} 

컴파일러 오류 : 'System :: Configuration :: Configuration()'에 대한 호출과 일치하는 함수가 없습니다.

중첩 된 구조체의 기본 생성자에 대한 정의가 아닌 선언이라 할지라도 오류는 사라집니다 - 왜?!

기타 세부 사항 : gcc 버전 4.4.3 (Ubuntu 4.4.3-4ubuntu5)

+1

어디서'Configuration' 개체를 사용하고 있습니까? –

+0

+1은 문제를보기에 충분한 코드를 제공하려고 시도했지만 -1은 오류 자체를 재현하기위한 실제 사용 사례를 제공하지 못했기 때문입니다. :) – GManNickG

+0

GMan : 죄송합니다. 단점을 깨닫고 발췌문을 편집했습니다. 귀하의 의견을 게시하는 바로 그 시점과 같습니다.) – oompahloompah

답변

7

m_config 먼저 기본 구성하고 할당됩니다. 멤버 목록을 사용하여 값을 직접 설정하십시오.

System::System() 
    : m_config(/*default params*/) 
{} 
+0

정확 하 게. 즉, 생성자 본문의 코드는 초기화가 아니라 할당입니다. 하지만 몸체를 입력하기 전에 모든 것이 초기화되어야하기 때문에 컴파일러는 기본 설정을 시도하고 실패합니다. 항상 초기화 목록을 사용하여 초기화해야합니다! – GManNickG

+0

Eeek !. 내 코드 스 니펫이 당신을 잘못 이끌었습니다. 초기화 목록에서 m_config를 사용할 수 없습니다. 기본 매개 변수를 얻는 데 관련된 몇 가지 작업이 있기 때문에 (몇 줄의 코드를 실행해야합니다). 그러나 처음에 기본 구성되고 할당 된 첫 번째에 대한 설명은 문제를 설명하는 데 도움이됩니다. 고마워, GMAN. – oompahloompah

+0

그러나 dflt ctor를 선언하고 정의하지 않으면 오류가 사라집니다. 정의가 없다면 링크 오류가있을 것이라고 생각했거나 컴파일러가 dflt ctor 코드를 자동 생성합니까? – oompahloompah

관련 문제