2017-03-21 1 views
1

Wenn ichein eigenes Aggregat Initialisieren von einer verspannt-init-Liste

class triangle 
{ 
private: 
    std::array<std::array<double, 2>, 3> m_vertices; 
}; 

triangle const unit_triangle{ { { { 0, 0 }, { 1, 0 }, { 0, 1 } } } }; 

ich die Fehlermeldung zu kompilieren versuchen

aus ‚Initialisiererliste‘ auf ‚Dreieck‘ nicht konvertieren.

Wenn ich private durch public ersetze, kompiliert der Code erfolgreich. Da ich das nicht machen will: Was muss ich machen, wenn ich unit_triangle aus einer braced-init-Liste initialisieren möchte?

Antwort

3

Mit einem private Element verhindert triangle ein aggregate sein. Es ist ein Aggregat, mit dem Sie einen triangle ohne triangle mit einem Konstruktor initialisieren können. Deshalb funktioniert es, wenn Sie private durch public ersetzen.

Um die gewünschte Syntax zu unterstützen, müssen Sie einfach den entsprechenden Konstruktor hinzufügen. In diesem Fall:

class triangle 
{ 
public: 
    triangle(std::array<std::array<double, 2>, 3> const& v) 
     : m_vertices(v) 
    { } 

private: 
    std::array<std::array<double, 2>, 3> m_vertices; 
}; 
Verwandte Themen