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&)
는 또한 (상속없이) 같은 일을하는 간단한 방법을 시도했다.
아이디어가 있으십니까? 의미론이 여기서 왜 작동하지 않는지 나는 볼 수 없다 ...
정확히 내가 생각한 것. 안 괄호는리스트와 같은 객체를 반환 할 것이고 바깥 쪽 괄호는 그 객체를 가져 와서 목록과 같은 객체 유형의 쉼표로 구분 된 값 목록으로 해석 할 수 있지만 외부 중괄호 안에있는 것은 이미 물체. 그러나이 작은 텍스트는': s '보다 더 혼란 스럽습니다. – rubenvb
그래서 내가 사용하는 구문을 허용하는 std :: intializer_list <> 생성자를 추가해야할까요? – Klaim
예,'TestMaster'가'std :: initializer_list' 생성자를 가지고 있다면'm_tests' 멤버를 초기화하는데 사용할 수 있습니다. –