复杂层次结构中的统一初始化语法?

时间:2011-03-03 13:27:07

标签: c++ initialization c++11

我正在使用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错了吗?

错误:

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&)

我还尝试了一种更简单的方法(没有继承):

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

同样的错误。

有什么想法吗?我不明白为什么语义在这里不起作用......

1 个答案:

答案 0 :(得分:4)

你的建筑水平太高了。初始化程序仅列出一个级别的工作,因此您需要告诉它您希望列表应用于TestList的{​​{1}}参数:

TestMaster

然后在TestMaster test_master(TestList({42,54,94})) 的构造函数中相同:

TestManager