2011-03-03 3 views
4

GCC 4.4.5를 사용하고 있습니다.복잡한 계층 구조의 통일 초기화 구문?

#include <vector> 

class Test 
{ 
public: 

    Test(int a, int b = 42) : m_a(a), m_b(b) {} 

private: 

    int m_a; 
    int m_b;  
}; 

typedef std::vector<Test> TestList; 


class TestMaster 
{ 
public: 

    TestMaster(TestList tests = TestList()) : m_tests(tests) {} 


private: 

    TestList m_tests; 

}; 

지금,이 작품 : 여기에

는 내 문제의 재현

int main() 
{ 

    TestList test_list = { 15, 22, 38 }; 


    return 0; 
} 

그러나 이것은 컴파일되지 않습니다 :

class TestManager : public TestMaster 
{ 
public: 

    TestManager() 
     : TestMaster({ { 42, 54, 94 } }) //? 
    {} 


}; 



int main() 
{ 

    TestManager test_manager; 


    return 0; 
} 

아니면 난 단지 돈을 올바른 구문을 사용하지 않습니까? 또는 GCC가 잘못 되었습니까?

오류가 : 같은 errror와

TestMaster test_master = { { 42, 54, 94 } }; 

:

g++ -std=c++0x hello_world.cpp 
hello_world.cpp: In constructor \u2018TestManager::TestManager()\u2019: 
hello_world.cpp:38: erreur: no matching function for call to \u2018TestMaster::TestMaster(<brace-enclosed initializer list>)\u2019 
hello_world.cpp:24: note: candidats sont: TestMaster::TestMaster(TestList) 
hello_world.cpp:21: note:     TestMaster::TestMaster(const TestMaster&) 

는 또한 (상속없이) 같은 일을하는 간단한 방법을 시도했다.

아이디어가 있으십니까? 의미론이 여기서 왜 작동하지 않는지 나는 볼 수 없다 ...

답변

4

당신은 너무 많은 수준의 건설이 진행 중이다. 다음

TestMaster test_master(TestList({42,54,94})) 

TestManager의 생성자에서 같은 :

TestManager() 
    : TestMaster(TestList({ 42, 54, 94 })) 
{} 
당신이 목록 TestMasterTestList 매개 변수에 적용 할 것인지를 알려줄 필요가 있도록 초기화 목록 만 한 수준에서 작동
+0

정확히 내가 생각한 것. 안 괄호는리스트와 같은 객체를 반환 할 것이고 바깥 쪽 괄호는 그 객체를 가져 와서 목록과 같은 객체 유형의 쉼표로 구분 된 값 목록으로 해석 할 수 있지만 외부 중괄호 안에있는 것은 이미 물체. 그러나이 작은 텍스트는': s '보다 더 혼란 스럽습니다. – rubenvb

+0

그래서 내가 사용하는 구문을 허용하는 std :: intializer_list <> 생성자를 추가해야할까요? – Klaim

+0

예,'TestMaster'가'std :: initializer_list' 생성자를 가지고 있다면'm_tests' 멤버를 초기화하는데 사용할 수 있습니다. –