tr1::array als Datenmember initialisieren



  • Hi Leute, ich hab hier ein bizarres problem:

    #include <tr1/array>
    
    template <typename T>
    class Vector3
    {
    public:
        Vector3(const T& x, const T& y, const T& z) { data_ = {{x,y,z}}; }
        // operators und blah ...
    private:
        std::tr1::array<T, 3> data_;
    };
    

    liefert die Compilerfehlermeldung: error: expected primary-expression before '{' token

    wenn ich hingegen schreibe

    Vector3(const T& x, const T& y, const T& z) { std::tr1::array<T,3> temp = {{x,y,z}}; }
    

    geht's durch.
    WTF? Wie soll ich denn den Array-member sonst initialisieren?

    Compiler ist gcc 4.2.1 auf OSX 10.6

    Gruß



  • tr1-Benutzer schrieb:

    WTF? Wie soll ich denn den Array-member sonst initialisieren?

    Der Unterschied bei den beiden Zeilen ist, dass du bei deinem Versuch, _data zu belegen, nach der initialisierung etwas zuweisen wolltest. Das temp-Array hast du dagegen direkt bei der Initialisierung belegt. Das ist ein riesen Unterschied.

    Schau dir mal Boost.Assign an.



  • Das klingt logisch.
    Also müsste ich es in der Element-Initialisierungsliste machen?

    Vector3(const T& x, const T& y, const T& z):data_({{1,2,3}}) {}
    

    gibt aber den selben Fehler.



  • Nein, das geht leider nur für die Initialisierug á la "Typ obj = {bla}". Zumindest, bis dein Compiler C++0x-fähig ist.
    Wie gesagt, boost.assign benutzen oder eine Funktion die das Array füllt (oder ein gefülltes Array zurückgibt) oder ....
    Es gibt viele Wege nach Rom, um ein wenig Schreibarbeit wirst du in C++03 aber nicht rumkommen.


Anmelden zum Antworten