<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Defition des move assignment operator außerhalb der Klasse ( Boost Move )]]></title><description><![CDATA[<p>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.<br />
Benutzt wird GCC 4.8.1 mit Kommandozeilenflag -std=c++98 (und keinem anderen)</p>
<pre><code>#include &lt;boost/move/move.hpp&gt;

class test
{
	BOOST_MOVABLE_BUT_NOT_COPYABLE(test)
public:
	test() {}
	test(BOOST_RV_REF(test)) {}
	test&amp; operator =(BOOST_RV_REF(test));
};

test&amp; test::operator =(BOOST_RV_REF(test)) {return *this;}

int main()
{
	test t;(void)t;
}
</code></pre>
<p>Hier bekomme ich die Fehlermeldung</p>
<pre><code>main.cpp:12:7: error: prototype for 'test&amp; test::operator=(boost::rv&lt;test&gt;&amp;)' does not match any in class 'test'
 test&amp; test::operator =(BOOST_RV_REF(test)) {return *this;}
       ^
main.cpp:9:8: error: candidates are: test&amp; test::operator=(boost::rv&lt;test&gt;&amp;)
  test&amp; 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&amp; test::operator=(test&amp;)
  BOOST_MOVABLE_BUT_NOT_COPYABLE(test)
  ^
</code></pre>
<p>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.<br />
So sieht die Klasse test übrigends aus, nachdem der Präprozessor für c++98 drüber war:<br />
(Von Hand nachformatiert)</p>
<pre><code>class test
{
	test(test&amp;);
	test&amp; operator =(test&amp;);
public:
	operator ::boost::rv&lt;test&gt;&amp;() 
	{ return *static_cast&lt; ::boost::rv&lt;test&gt;* &gt;(this); } 

	operator const ::boost::rv&lt;test&gt;&amp;() const 
	{ return *static_cast&lt;const ::boost::rv&lt;test&gt;* &gt;(this); }

	test() {}
	test(::boost::rv&lt;test&gt;&amp;) {}
	test&amp; operator =(::boost::rv&lt;test&gt;&amp;);
};

test&amp; test::operator =(::boost::rv&lt;test&gt;&amp;) {return *this;}

int main()
{
	test t;(void)t;
}
</code></pre>
<p>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?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/318647/defition-des-move-assignment-operator-außerhalb-der-klasse-boost-move</link><generator>RSS for Node</generator><lastBuildDate>Mon, 27 Jul 2026 05:37:09 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/318647.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 21 Jul 2013 14:17:16 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Defition des move assignment operator außerhalb der Klasse ( Boost Move ) on Sun, 21 Jul 2013 14:17:16 GMT]]></title><description><![CDATA[<p>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.<br />
Benutzt wird GCC 4.8.1 mit Kommandozeilenflag -std=c++98 (und keinem anderen)</p>
<pre><code>#include &lt;boost/move/move.hpp&gt;

class test
{
	BOOST_MOVABLE_BUT_NOT_COPYABLE(test)
public:
	test() {}
	test(BOOST_RV_REF(test)) {}
	test&amp; operator =(BOOST_RV_REF(test));
};

test&amp; test::operator =(BOOST_RV_REF(test)) {return *this;}

int main()
{
	test t;(void)t;
}
</code></pre>
<p>Hier bekomme ich die Fehlermeldung</p>
<pre><code>main.cpp:12:7: error: prototype for 'test&amp; test::operator=(boost::rv&lt;test&gt;&amp;)' does not match any in class 'test'
 test&amp; test::operator =(BOOST_RV_REF(test)) {return *this;}
       ^
main.cpp:9:8: error: candidates are: test&amp; test::operator=(boost::rv&lt;test&gt;&amp;)
  test&amp; 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&amp; test::operator=(test&amp;)
  BOOST_MOVABLE_BUT_NOT_COPYABLE(test)
  ^
</code></pre>
<p>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.<br />
So sieht die Klasse test übrigends aus, nachdem der Präprozessor für c++98 drüber war:<br />
(Von Hand nachformatiert)</p>
<pre><code>class test
{
	test(test&amp;);
	test&amp; operator =(test&amp;);
public:
	operator ::boost::rv&lt;test&gt;&amp;() 
	{ return *static_cast&lt; ::boost::rv&lt;test&gt;* &gt;(this); } 

	operator const ::boost::rv&lt;test&gt;&amp;() const 
	{ return *static_cast&lt;const ::boost::rv&lt;test&gt;* &gt;(this); }

	test() {}
	test(::boost::rv&lt;test&gt;&amp;) {}
	test&amp; operator =(::boost::rv&lt;test&gt;&amp;);
};

test&amp; test::operator =(::boost::rv&lt;test&gt;&amp;) {return *this;}

int main()
{
	test t;(void)t;
}
</code></pre>
<p>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?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2340182</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2340182</guid><dc:creator><![CDATA[Flashput]]></dc:creator><pubDate>Sun, 21 Jul 2013 14:17:16 GMT</pubDate></item><item><title><![CDATA[Reply to Defition des move assignment operator außerhalb der Klasse ( Boost Move ) on Sun, 21 Jul 2013 14:35:28 GMT]]></title><description><![CDATA[<p>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.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2340186</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2340186</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Sun, 21 Jul 2013 14:35:28 GMT</pubDate></item><item><title><![CDATA[Reply to Defition des move assignment operator außerhalb der Klasse ( Boost Move ) on Sun, 21 Jul 2013 16:34:27 GMT]]></title><description><![CDATA[<p>Der <a href="http://gcc.gnu.org/bugzilla/show_bug.cgi?id=53725" rel="nofollow">Bug</a> ist offenbar bekannt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2340199</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2340199</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Sun, 21 Jul 2013 16:34:27 GMT</pubDate></item><item><title><![CDATA[Reply to Defition des move assignment operator außerhalb der Klasse ( Boost Move ) on Sun, 21 Jul 2013 17:50:50 GMT]]></title><description><![CDATA[<p>Nah ok, danke, das beruhigt mich. Da hab ich wohl nicht nach den richtigen Stichwörtern gesucht.<br />
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.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2340220</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2340220</guid><dc:creator><![CDATA[Flashput]]></dc:creator><pubDate>Sun, 21 Jul 2013 17:50:50 GMT</pubDate></item><item><title><![CDATA[Reply to Defition des move assignment operator außerhalb der Klasse ( Boost Move ) on Sun, 21 Jul 2013 17:55:02 GMT]]></title><description><![CDATA[<blockquote>
<p>g++ 3.4.6, 4.0.4, 4.1.2 und 4.2.4</p>
</blockquote>
<p>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?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2340221</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2340221</guid><dc:creator><![CDATA[Sone]]></dc:creator><pubDate>Sun, 21 Jul 2013 17:55:02 GMT</pubDate></item><item><title><![CDATA[Reply to Defition des move assignment operator außerhalb der Klasse ( Boost Move ) on Sun, 21 Jul 2013 21:15:19 GMT]]></title><description><![CDATA[<p>installiert</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2340252</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2340252</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Sun, 21 Jul 2013 21:15:19 GMT</pubDate></item></channel></rss>