Typdef geht nicht



  • Warum bekomme ich Fehlermeldungen, dass SceneNodePtr nicht deklariert ist?

    class SceneNode
    {
    public:
    
        typedef std::unique_ptr<SceneNode> SceneNodePtr;
    
        void attachChild(SceneNodePtr child);
    };
    

  • Mod

    Liegt die Fehlermeldung direkt in Zeile 7? Dann weiß ich nicht weiter.

    Und natürlich auch sonst nicht, denn du gibst praktisch keine Fehlermeldung oder Angaben. Und die Glaskugel wird gereinigt (zu viele Kaugummis am Boden).



  • Vermutlich ist SceneNode/unique_ptr nicht deklariert. Da bekommt man manchmal so mysteriöse Fehlermeldungen. Header vergessen?


  • Mod

    Ethon schrieb:

    Vermutlich ist SceneNode/unique_ptr nicht deklariert. Da bekommt man manchmal so mysteriöse Fehlermeldungen.

    Kenne ich nicht, macht auch keinen Sinn. Da sollte direkt das Typedef krachen. Wieso sollte es stattdessen einfach ignoriert werden?

    Edit: Bei VC++ weiß man natürlich nie. Beim GCC wäre so etwas nicht passiert.
    Aber ich gehe davon aus, dass das nicht alles ist, was die Fehlermeldung hergibt.



  • Ne, gerade beim GCC hatte ich schon öfters das Problem dass ein Typedef heimlich kaputt ist.



  • Ich tippe mal, es liegt daran, dass SceneNode an dieser Stelle noch incomplete ist, der unique_ptr aber nicht mit incomplete Typen funktioniert.


  • Mod

    Das kann eigentlich sogar sein, ich erinnere mich - das ist mir doch schon einmal passiert. Ein Typedef war da nicht definiert, weil ein Fehler in der Instantiierung des getypedeften Namens auftrat.



  • #include <memory>
    #include <cstddef>
    
    class SceneNode
    {
    public:
    
        typedef std::unique_ptr<SceneNode> SceneNodePtr;
    
        void attachChild(SceneNodePtr) {}
    };
    
    int main()
    {
    	SceneNode n;
    	n.attachChild(SceneNode::SceneNodePtr());
    }
    

    Es funktioniert bei mir problemlos. Eigentlich dürften es auch keine Probleme geben, da der Type erst beim Istanziieren eines Aufrufes vom Klammer-Operator von std::default_delete vollständig sein muss, und das ist der Type ja bei dem Funktionsaufruf.

    20.7.1 Class template unique_ptr schrieb:

    5 Each object of a type U instantiated from the unique_ptr template specified in this subclause has the strict
    ownership semantics, specified above, of a unique pointer. In partial satisfaction of these semantics, each
    such U is MoveConstructible and MoveAssignable, but is not CopyConstructible nor CopyAssignable.
    The template parameter T of unique_ptr may be an incomplete type.

    20.7.1.1.2 default_delete schrieb:

    void operator()(T *ptr) const;
    3 Effects: calls delete on ptr.
    4 Remarks: If T is an incomplete type, the program is ill-formed.



  • So habe es hinbekommen,
    ich musste in CodeBlocks unter den Compiler Settings das Flag "Have g++ follow the C++11 ISO C++ language standard" setzen.
    Jetzt funktioniert alles.


Anmelden zum Antworten