Единый синтаксис инициализации в построении сложной иерархии? - PullRequest
4 голосов
/ 03 марта 2011

Я использую 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 Ответ

4 голосов
/ 03 марта 2011

У вас слишком много уровней строительства. Списки инициализатора работают только на одном уровне, поэтому вам нужно указать, что вы хотите, чтобы список применялся к параметру TestList TestMaster:

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

и то же самое в конструкторе TestManager:

TestManager()
    : TestMaster( TestList( { 42, 54, 94 } ) )
{}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...