<?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[compiler-fehler bei static member und überladenem operator()]]></title><description><![CDATA[<p>folgender code:</p>
<pre><code class="language-cpp">struct Foo
{
    void operator() () {}
};

template&lt;class T&gt;
struct Bar
{
    static T t;
};

template&lt;&gt; Foo Bar&lt;Foo&gt;::t;

int main()
{
    Bar&lt;Foo&gt; b;
    b.t();
    // kein fehler mit:
    //b.t;
}
</code></pre>
<p>mit dem g++ 3.4.1 beschwert sich der linker, wenn man bei zeile19 b.t() aufruft:</p>
<blockquote>
<p>/tmp/ccgvCaHN.o(.text+0x1f): In function <code>main': : undefined reference to</code>Bar&lt;Foo&gt;::t'</p>
</blockquote>
<p>so, als ob das objekt nirgends initialisiert würde. schreibt man in zeile14 dann</p>
<pre><code class="language-cpp">template&lt;&gt; Foo Bar&lt;Foo&gt;::t();
</code></pre>
<p>kommt:</p>
<blockquote>
<p>static.cpp:15: error: no member function `t' declared in `Bar&lt;Foo&gt;'</p>
</blockquote>
<p>.</p>
<p>erst wenn man den copy-ctor verwendet, klappt es wieder:</p>
<pre><code class="language-cpp">Foo cpy_obj;
template&lt;&gt; Foo Bar&lt;Foo&gt;::t( cpy_obj );
// aber nicht:
// template&lt;&gt; Bar&lt;Foo&gt;::t( Foo() ); // funktions-fehler wie oben
</code></pre>
<p>imho ein compilerfehler! ich bitte um kommentare.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/160551/compiler-fehler-bei-static-member-und-überladenem-operator</link><generator>RSS for Node</generator><lastBuildDate>Fri, 11 Sep 2026 16:56:19 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/160551.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 26 Sep 2006 19:37:28 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to compiler-fehler bei static member und überladenem operator() on Tue, 26 Sep 2006 19:37:28 GMT]]></title><description><![CDATA[<p>folgender code:</p>
<pre><code class="language-cpp">struct Foo
{
    void operator() () {}
};

template&lt;class T&gt;
struct Bar
{
    static T t;
};

template&lt;&gt; Foo Bar&lt;Foo&gt;::t;

int main()
{
    Bar&lt;Foo&gt; b;
    b.t();
    // kein fehler mit:
    //b.t;
}
</code></pre>
<p>mit dem g++ 3.4.1 beschwert sich der linker, wenn man bei zeile19 b.t() aufruft:</p>
<blockquote>
<p>/tmp/ccgvCaHN.o(.text+0x1f): In function <code>main': : undefined reference to</code>Bar&lt;Foo&gt;::t'</p>
</blockquote>
<p>so, als ob das objekt nirgends initialisiert würde. schreibt man in zeile14 dann</p>
<pre><code class="language-cpp">template&lt;&gt; Foo Bar&lt;Foo&gt;::t();
</code></pre>
<p>kommt:</p>
<blockquote>
<p>static.cpp:15: error: no member function `t' declared in `Bar&lt;Foo&gt;'</p>
</blockquote>
<p>.</p>
<p>erst wenn man den copy-ctor verwendet, klappt es wieder:</p>
<pre><code class="language-cpp">Foo cpy_obj;
template&lt;&gt; Foo Bar&lt;Foo&gt;::t( cpy_obj );
// aber nicht:
// template&lt;&gt; Bar&lt;Foo&gt;::t( Foo() ); // funktions-fehler wie oben
</code></pre>
<p>imho ein compilerfehler! ich bitte um kommentare.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1145085</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1145085</guid><dc:creator><![CDATA[eadgseg]]></dc:creator><pubDate>Tue, 26 Sep 2006 19:37:28 GMT</pubDate></item><item><title><![CDATA[Reply to compiler-fehler bei static member und überladenem operator() on Tue, 26 Sep 2006 20:59:16 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">struct foo
{
	void operator()( void )
	{
		std::cout &lt;&lt; &quot;foo::operator ()\n&quot;;
	}
};

template&lt; typename type &gt;
struct bar
{
	static type t;
};

template&lt; typename type &gt; type bar&lt; type &gt;::t;
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1145139</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1145139</guid><dc:creator><![CDATA[David_pb]]></dc:creator><pubDate>Tue, 26 Sep 2006 20:59:16 GMT</pubDate></item><item><title><![CDATA[Reply to compiler-fehler bei static member und überladenem operator() on Thu, 28 Sep 2006 14:39:59 GMT]]></title><description><![CDATA[<p>das funzt, aber ich brauche die spezialisierung.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1146022</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1146022</guid><dc:creator><![CDATA[dfhreh]]></dc:creator><pubDate>Thu, 28 Sep 2006 14:39:59 GMT</pubDate></item><item><title><![CDATA[Reply to compiler-fehler bei static member und überladenem operator() on Sat, 30 Sep 2006 16:58:15 GMT]]></title><description><![CDATA[<p>*push*</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1147131</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1147131</guid><dc:creator><![CDATA[twetwet]]></dc:creator><pubDate>Sat, 30 Sep 2006 16:58:15 GMT</pubDate></item><item><title><![CDATA[Reply to compiler-fehler bei static member und überladenem operator() on Mon, 02 Oct 2006 06:36:42 GMT]]></title><description><![CDATA[<p>Habe es mit Version 3.4.5 getestet, funktioniert problemlos. Was mich allerdings etwas verwundert. Da der Member statisch ist, dürfte nur</p>
<pre><code class="language-cpp">Bar&lt;Foo&gt;::t();
</code></pre>
<p>zulässig sein.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1147712</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1147712</guid><dc:creator><![CDATA[groovemaster]]></dc:creator><pubDate>Mon, 02 Oct 2006 06:36:42 GMT</pubDate></item><item><title><![CDATA[Reply to compiler-fehler bei static member und überladenem operator() on Mon, 02 Oct 2006 12:20:57 GMT]]></title><description><![CDATA[<p>@eadgseg<br />
Das ist kein Compiler-Bug sondern eine (böse) Falle in C++.<br />
Das hier:</p>
<pre><code class="language-cpp">template&lt;&gt; Foo Bar&lt;Foo&gt;::t;
</code></pre>
<p>ist eine sogenannte &quot;non-defining out of class declaration&quot;. Für normale Klassen gibt es soetwas nicht und das Ganze wäre schlicht eine Definition von t. Für vollständige spezialisierte Templates (bzw. deren Member) sieht das aber anders aus. Zum einen muss eine solche Spezialisierung in jeder ÜE, in der sie verwendet wird sichtbar sein, gleichzeitig ist sie aber kein Template mehr.<br />
Würde die oben zitierte Syntax zu einer Definition führen, dann hättest du ein Problem: sobald mehr als eine ÜE die Spezialisierung verwendet, käme es zu einer Mehrfachdefinition von t.<br />
Aus diesem Grund besagt der C++ Standard, dass template&lt;&gt; Foo Bar&lt;Foo&gt;::t lediglich eine Deklaration ist.</p>
<p>Das löst das &quot;Mehrfachdefinition&quot;-Problem, führt aber zu einem anderen: es gibt in C++ keine Syntax, die die Default-Initialisierung eines vollständig spezialisierten statischen Members zulässt. Du bist also auf Copy-Initialisierung angewiesen:</p>
<pre><code class="language-cpp">template&lt;&gt; Foo Bar&lt;Foo&gt;::t = Foo();
</code></pre>
<p>groovemaster schrieb:</p>
<blockquote>
<p>Habe es mit Version 3.4.5 getestet, funktioniert problemlos. Was mich allerdings etwas verwundert. Da der Member statisch ist, dürfte nur</p>
<pre><code class="language-cpp">Bar&lt;Foo&gt;::t();
</code></pre>
<p>zulässig sein.</p>
</blockquote>
<p>Wie kommst du darauf?</p>
<pre><code class="language-cpp">class X {
public:
 static int f();
};

int main() {
 X x;
 x.f();
}
</code></pre>
<p>Das ist legales C++ und x.f() ist in diesem Fall äquivalent zu X::f();</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1147948</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1147948</guid><dc:creator><![CDATA[HumeSikkins]]></dc:creator><pubDate>Mon, 02 Oct 2006 12:20:57 GMT</pubDate></item><item><title><![CDATA[Reply to compiler-fehler bei static member und überladenem operator() on Mon, 02 Oct 2006 12:57:42 GMT]]></title><description><![CDATA[<p>HumeSikkins schrieb:</p>
<blockquote>
<p>...&quot;non-defining out of class declaration&quot;...</p>
</blockquote>
<p><img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f62e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_open_mouth"
      title=":open_mouth:"
      alt="😮"
    /> <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f62e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_open_mouth"
      title=":open_mouth:"
      alt="😮"
    /> <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f62e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_open_mouth"
      title=":open_mouth:"
      alt="😮"
    /> <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f44d.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--thumbs_up"
      title=":+1:"
      alt="👍"
    /></p>
<p>Wäre ich NIE drauf gekommen.<br />
und Du hast es auch noch so gut erklärt, dass ich es begriffen habe (glaube ich).<br />
Also ein Konflikt zwischen &quot;vollständiger Spezialisierung&quot; und &quot;One-Definition-Rule&quot;... hmmmm da werde ich noch ein wenig drüber nachdenken.</p>
<p>Danke,</p>
<p>Simon2.</p>
<p>P.S.: Hast Du eine Kapitelangabe aus dem Standard darüber ?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1147982</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1147982</guid><dc:creator><![CDATA[Simon2]]></dc:creator><pubDate>Mon, 02 Oct 2006 12:57:42 GMT</pubDate></item><item><title><![CDATA[Reply to compiler-fehler bei static member und überladenem operator() on Mon, 02 Oct 2006 13:07:41 GMT]]></title><description><![CDATA[<p>Simon2 schrieb:</p>
<blockquote>
<p>P.S.: Hast Du eine Kapitelangabe aus dem Standard darüber ?</p>
</blockquote>
<p>14.7.3/15:</p>
<blockquote>
<p>An explicit specialization of a static data member of a template is a definition if the declaration includes an initializer; <strong>otherwise, it is a declaration</strong>. [Note: there is no syntax for the definition of a static data member of a template that requires default initialization.</p>
<p>template&lt;&gt; X Q&lt;int&gt;::x;</p>
<p><strong>This is a declaration</strong> regardless of whether X can be default initialized (8.5). ]</p>
</blockquote>
<p>Hervorhebung von mir.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1147993</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1147993</guid><dc:creator><![CDATA[HumeSikkins]]></dc:creator><pubDate>Mon, 02 Oct 2006 13:07:41 GMT</pubDate></item><item><title><![CDATA[Reply to compiler-fehler bei static member und überladenem operator() on Mon, 02 Oct 2006 13:52:07 GMT]]></title><description><![CDATA[<p>Ah, vielen Dank !</p>
<p>Gruß,</p>
<p>Simon2.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1148026</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1148026</guid><dc:creator><![CDATA[Simon2]]></dc:creator><pubDate>Mon, 02 Oct 2006 13:52:07 GMT</pubDate></item><item><title><![CDATA[Reply to compiler-fehler bei static member und überladenem operator() on Mon, 02 Oct 2006 17:50:01 GMT]]></title><description><![CDATA[<p>HumeSikkins schrieb:</p>
<blockquote>
<p>Wie kommst du darauf?</p>
</blockquote>
<p>Da bin ich ehrlich gesagt etwas baff. Habe nicht gedacht, dass ein static Member auch über eine Instanz angesprochen werden kann. Würde man wohl auch nicht vermuten, da solche Member kein this kennen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1148162</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1148162</guid><dc:creator><![CDATA[groovemaster]]></dc:creator><pubDate>Mon, 02 Oct 2006 17:50:01 GMT</pubDate></item></channel></rss>