2017-02-07 5 views
1

ich einen Code haben, die effektiv reduziert sich aufÄndern eines Elementinitialisierung Liste

#include <vector> 
class A { 
    std::vector<int> m_sizes; 
public: 
    A(std::initializer_list<int> const& sizes) : m_sizes(sizes) {} 
}; 

class B { 
    A m_a; 
public: 
    B(int size_front, int size_back, std::initializer_list<int> const& sizes) : m_a({ size_front, sizes, size_back }) {} 
}; 

Der Compiler beschwert sich, dass keine Instanz von A::A die Argumentliste übereinstimmt. Gibt es eine Möglichkeit, die { int, std::initializer_list<int>, int } zu einer std::initializer_list<int> zu glätten oder muss ich A einen zusätzlichen Konstruktor geben, um diese Situation zu behandeln? Was passiert, wenn ich die Klasse A nicht ändern kann?

+2

A 'std :: initializer_list' nicht veränderbar ist. Diese Vorlage ist hauptsächlich für den eigenen Gebrauch des Compilers gedacht. Die einzige Möglichkeit, eine neue 'std :: initializer_list 'zu initialisieren, besteht darin, einen Standardkonstruktor zu verwenden, der eine leere Liste oder eine Klammerkonstante erzeugt. In diesem Fall benötigt 'A' einen anderen Konstruktor, der einen' vector' Parameter akzeptiert und verwendet, um 'm_sizes' zu initialisieren; dann können Sie diesen Konstruktor verwenden. Wenn Sie die Klasse "A" nicht ändern können, kann nichts getan werden. C++ funktioniert nicht so. –

Antwort

2

Was Sie versuchen, ist nicht möglich: initializer_list<T> muss aus einer Liste von Elementen des Typs T erstellt werden, deren Anzahl zur Kompilierungszeit bekannt ist. Das Einfügen einer vorhandenen Liste in der Mitte funktioniert nicht.

Sie können durch Hinzufügen einer Konstruktor Überlastung, um dieses Problem zu umgehen, die direkt eine vector<int> nimmt, und Anrufe an sie weiterzuleiten:

class A { 
    std::vector<int> m_sizes; 
public: 
    A(const std::vector<int>& sizes) : m_sizes(sizes) {} 
    A(std::initializer_list<int> const& sizes) : A(std::vector(sizes)) {} 
}; 
class B { 
    A m_a; 
    std::vector<int> frame(int size_front, int size_back, std::initializer_list<int> const& sizes) { 
     std::vector res; 
     res.push_back(size_front); 
     std::copy(sizes.begin(), sizes.end(), std::back_inserter(res)); 
     res.push_back(size_back); 
     return res; 
    } 
public: 
    B(int size_front, int size_back, std::initializer_list<int> const& sizes) : m_a(frame(size_front, size_back, sizes)) {} 
}; 
+0

Hmmn .... Ich rieche Copy-Paste Fehler? .... Überprüfen Sie die Reihenfolge der Typen der Parameter in der Member-Funktion 'B :: frame()', und was Sie in der * Member-Initialisierungsliste übergeben * in 'B's Konstruktor – WhiZTiM

+0

@WhiZTiM Du hast absolut recht, vielen Dank! – dasblinkenlight