4 votes

Syntaxe d'initialisation uniforme dans la construction de hiérarchies complexes ?

J'utilise GCC 4.4.5.

Voici la reproduction de mon problème :

#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;

};

Maintenant, ça marche :

int main()
{

    TestList test_list = { 15, 22, 38 };

    return 0;
}

Mais cela ne compile pas :

class TestManager : public TestMaster
{
public:

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

};

int main()
{

    TestManager test_manager;

    return 0;
}

Ou peut-être que je n'utilise pas la bonne syntaxe ? Ou bien GCC se trompe-t-il ?

L'erreur :

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

J'ai également essayé une manière plus simple de faire la même chose (sans héritage) :

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

Avec la même erreur.

Une idée ? Je ne vois pas pourquoi la sémantique ne fonctionnerait pas ici...

4voto

Anthony Williams Points 28904

Vous avez trop de niveaux de construction en cours. Les listes d'initialisation ne fonctionnent qu'à un seul niveau, vous devez donc lui dire que vous voulez que la liste s'applique à l'élément TestList paramètre de TestMaster :

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

et ensuite la même chose dans le constructeur de TestManager :

TestManager()
    : TestMaster( TestList( { 42, 54, 94 } ) )
{}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X