Defition des move assignment operator außerhalb der Klasse ( Boost Move )



  • Ich bin neulich auf ein Problem gestoßen welches ich nicht lösen konnte, also hab ich das ganze nachgestellt. Es folgt ein Ausschnitt, in dem eine Klasse 'test' mithilfe von Boost.Move movable gemacht wird. Die Definition des move assignment operator muss allerdings in einer seperaten Implementationsdatai stehen.
    Benutzt wird GCC 4.8.1 mit Kommandozeilenflag -std=c++98 (und keinem anderen)

    #include <boost/move/move.hpp>
    
    class test
    {
    	BOOST_MOVABLE_BUT_NOT_COPYABLE(test)
    public:
    	test() {}
    	test(BOOST_RV_REF(test)) {}
    	test& operator =(BOOST_RV_REF(test));
    };
    
    test& test::operator =(BOOST_RV_REF(test)) {return *this;}
    
    int main()
    {
    	test t;(void)t;
    }
    

    Hier bekomme ich die Fehlermeldung

    main.cpp:12:7: error: prototype for 'test& test::operator=(boost::rv<test>&)' does not match any in class 'test'
     test& test::operator =(BOOST_RV_REF(test)) {return *this;}
           ^
    main.cpp:9:8: error: candidates are: test& test::operator=(boost::rv<test>&)
      test& operator =(BOOST_RV_REF(test));
            ^
    In file included from include\boost\move\utility.hpp:18:0,
                     from include\boost\move\move.hpp:21,
                     from main.cpp:1:
    main.cpp:5:2: error:                 test& test::operator=(test&)
      BOOST_MOVABLE_BUT_NOT_COPYABLE(test)
      ^
    

    Wenn ich das ganze allerdings unter C++11 übersetzen lasse, den operator inline in der Klassendefinition definiere, oder BOOST_MOVABLE_BUT_NOT_COPYABLE auskommentiere, funktioniert es.
    So sieht die Klasse test übrigends aus, nachdem der Präprozessor für c++98 drüber war:
    (Von Hand nachformatiert)

    class test
    {
    	test(test&);
    	test& operator =(test&);
    public:
    	operator ::boost::rv<test>&() 
    	{ return *static_cast< ::boost::rv<test>* >(this); } 
    
    	operator const ::boost::rv<test>&() const 
    	{ return *static_cast<const ::boost::rv<test>* >(this); }
    
    	test() {}
    	test(::boost::rv<test>&) {}
    	test& operator =(::boost::rv<test>&);
    };
    
    test& test::operator =(::boost::rv<test>&) {return *this;}
    
    int main()
    {
    	test t;(void)t;
    }
    

    Also, ich kann nicht von mir behaupten, dass ich weiß, was hier schiefläuft. Aus der Fehlermeldung werde ich auch nicht schlau, es sieht höchstens für mich so aus als währe alles korrekt. Habe ich irgendeinen Sprachaspekt übersehen oder was habe ich falsch gemacht?


  • Mod

    Code kompiliert mit g++ 3.4.6, 4.0.4, 4.1.2 und 4.2.4, Versionen ab 4.3 zeigen den beschriebenen Fehler, clang 3.3 akzeptiert den Code. Sieht soweit auch unproblematisch aus, also wahrscheinlich ein Compilerbug.


  • Mod

    Der Bug ist offenbar bekannt.



  • Nah ok, danke, das beruhigt mich. Da hab ich wohl nicht nach den richtigen Stichwörtern gesucht.
    Nun, aber wenigstens kann ich das ganze problem umgehen indem ich im assignment operator eine Memberfunktion aufrufe die die Arbeit übernimmt. Die kann ich immerhin auslagern.



  • g++ 3.4.6, 4.0.4, 4.1.2 und 4.2.4

    Kurze Frage, camper, hast du die alle installiert? Oder gibt es da so eine ... sagen wir, Website, die für Zehn verschiedene GCCs den Code kompiliert?


  • Mod

    installiert


Log in to reply