<?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[template fehler... aber warum?]]></title><description><![CDATA[<p>Moins,</p>
<p>Ich hab ein template welches nicht so tut wie es sollte...<br />
Mach ich was falsch?</p>
<p><strong>gcc -v</strong></p>
<pre><code>Using built-in specs.
Configured with: FreeBSD/i386 system compiler
Thread model: posix
gcc version 3.4.6 [FreeBSD] 20060305
</code></pre>
<p>code:</p>
<pre><code class="language-cpp">/* header der class */
 template&lt;class T&gt; void operator%(T arg);

/* src der class */
  template&lt;class T&gt; void va_arg::operator%(T arg)
  {
    std::string digit = boost::lexical_cast&lt;std::string&gt;(arg);
    liste.push_back(Glib::locale_to_utf8(digit));
  } /* end function va_arg::operator%(T) */

/* test src */
 test_va % static_cast&lt;omp::uint32&gt;(age);
</code></pre>
<p>compiler fehler:</p>
<pre><code>/var/tmp//cctM8OwM.o(.text+0x38f): In function `main':
/home/pascal/openmediaplayer/test/omp_va_test.cpp:21: undefined reference to `void omp::va_arg::operator%&lt;unsigned int&gt;(unsigned int)'
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/topic/179560/template-fehler-aber-warum</link><generator>RSS for Node</generator><lastBuildDate>Mon, 21 Sep 2026 07:00:16 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/179560.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 23 Apr 2007 09:17:30 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to template fehler... aber warum? on Mon, 23 Apr 2007 09:17:30 GMT]]></title><description><![CDATA[<p>Moins,</p>
<p>Ich hab ein template welches nicht so tut wie es sollte...<br />
Mach ich was falsch?</p>
<p><strong>gcc -v</strong></p>
<pre><code>Using built-in specs.
Configured with: FreeBSD/i386 system compiler
Thread model: posix
gcc version 3.4.6 [FreeBSD] 20060305
</code></pre>
<p>code:</p>
<pre><code class="language-cpp">/* header der class */
 template&lt;class T&gt; void operator%(T arg);

/* src der class */
  template&lt;class T&gt; void va_arg::operator%(T arg)
  {
    std::string digit = boost::lexical_cast&lt;std::string&gt;(arg);
    liste.push_back(Glib::locale_to_utf8(digit));
  } /* end function va_arg::operator%(T) */

/* test src */
 test_va % static_cast&lt;omp::uint32&gt;(age);
</code></pre>
<p>compiler fehler:</p>
<pre><code>/var/tmp//cctM8OwM.o(.text+0x38f): In function `main':
/home/pascal/openmediaplayer/test/omp_va_test.cpp:21: undefined reference to `void omp::va_arg::operator%&lt;unsigned int&gt;(unsigned int)'
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1271580</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1271580</guid><dc:creator><![CDATA[xGhost]]></dc:creator><pubDate>Mon, 23 Apr 2007 09:17:30 GMT</pubDate></item><item><title><![CDATA[Reply to template fehler... aber warum? on Mon, 23 Apr 2007 09:20:34 GMT]]></title><description><![CDATA[<p>Und wie ist dieser Code auf Quelldateien verteilt? Bei Templates muß der Compiler die Instanziierung und Definition der Funktionen an einem Ort haben -&gt; die Implementation gehört direkt in den Header.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1271584</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1271584</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Mon, 23 Apr 2007 09:20:34 GMT</pubDate></item><item><title><![CDATA[Reply to template fehler... aber warum? on Mon, 23 Apr 2007 09:29:07 GMT]]></title><description><![CDATA[<p>&quot;header der class&quot; =&gt; include/omp_va.hpp<br />
&quot;src der class&quot; =&gt; src/omp_va.cpp<br />
&quot;test src&quot; =&gt; tests/omp_va_test.cpp</p>
<p>aus den zwei ersten daten gibt es ein omp_va.o<br />
welches ich dann in &quot;test src&quot; linke.</p>
<p><strong>EDIT</strong><br />
Ich soll das in die header datei reinschreiben?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1271586</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1271586</guid><dc:creator><![CDATA[xGhost]]></dc:creator><pubDate>Mon, 23 Apr 2007 09:29:07 GMT</pubDate></item><item><title><![CDATA[Reply to template fehler... aber warum? on Mon, 23 Apr 2007 09:28:37 GMT]]></title><description><![CDATA[<p>CStoll schrieb:</p>
<blockquote>
<p>-&gt; die Implementation gehört direkt in den Header.</p>
</blockquote>
]]></description><link>https://www.c-plusplus.net/forum/post/1271589</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1271589</guid><dc:creator><![CDATA[MFK]]></dc:creator><pubDate>Mon, 23 Apr 2007 09:28:37 GMT</pubDate></item><item><title><![CDATA[Reply to template fehler... aber warum? on Mon, 23 Apr 2007 09:30:46 GMT]]></title><description><![CDATA[<p>Genau wie ich es mir gedacht habe - die Implementation der Methode gehört auch in die &quot;omp_va.hpp&quot; <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
<p>Zur Erklärung: Die beiden CPP-Files werden unabhängig voneinander compiliert.<br />
Wenn der Compiler die &quot;omp_va.cpp&quot; anfasst, sieht er zwar den Quellcode der Funktion, aber er weiß nicht, welche Version(en) später tatsächlich benötigt werden. Und weil er nicht alle Versionen erzeugen kann (erstens reicht der Platz dazu nicht aus und zweitens kennt er noch gar nicht alle Typen, die du dort verwenden willst), legt er nur die Instanziierungen an, die er findet - keine.<br />
Wenn er dann die &quot;omp_va_test.cpp&quot; übersetzen soll, erfährt er die benötigte Spezialisierung. Aber er findet keine Definition dieser Funktion (weder vor Ort noch in der omp_va.o (siehe oben), also beschwert sich zu recht der Linker.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1271593</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1271593</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Mon, 23 Apr 2007 09:30:46 GMT</pubDate></item><item><title><![CDATA[Reply to template fehler... aber warum? on Mon, 23 Apr 2007 12:21:16 GMT]]></title><description><![CDATA[<p>Hi,</p>
<p>nur am Rande: Ich glaube nicht, dass der operator%() hier eine gute Wahl ist für das, was Du fachlich machen möchtest....</p>
<p>xGhost schrieb:</p>
<blockquote>
<p>...</p>
<pre><code class="language-cpp">template&lt;class T&gt; void va_arg::operator%(T arg)
  {
    std::string digit = boost::lexical_cast&lt;std::string&gt;(arg);
    liste.push_back(Glib::locale_to_utf8(digit));
  }
</code></pre>
<p>...</p>
</blockquote>
<p>Es ist meistens keine gute Idee, Operatoren anders zu verwenden, als die meisten Nutzer es intuitiv erwarten. Das sage ich aus leidvoller eigener Erfahrung. Und ich würde unter dem &quot;% mit einem integer&quot; doch eher sowas wie Modulus-Division erwartet.</p>
<p>Für das, nach was es mir aussieht, wäre wohl (wenn überhaupt) der operator&lt;&lt;() besser geeignet.<br />
Außerdem würde ich nicht void, sondern ein va_arg&amp; zurückgeben, dann kannst Du den operator geeignet verketten ... wie man es z.B. von streams gewohnt ist.</p>
<p>Gruß,</p>
<p>Simon2.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1271704</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1271704</guid><dc:creator><![CDATA[Simon2]]></dc:creator><pubDate>Mon, 23 Apr 2007 12:21:16 GMT</pubDate></item><item><title><![CDATA[Reply to template fehler... aber warum? on Mon, 23 Apr 2007 12:26:44 GMT]]></title><description><![CDATA[<p>Simon2 schrieb:</p>
<blockquote>
<p>Für das, nach was es mir aussieht, wäre wohl (wenn überhaupt) der operator&lt;&lt;() besser geeignet.<br />
Außerdem würde ich nicht void, sondern ein va_arg&amp; zurückgeben, dann kannst Du den operator geeignet verketten ... wie man es z.B. von streams gewohnt ist.</p>
</blockquote>
<p>Eine gute Idee.<br />
Ich war wohl zu sehr auf OSS und Xorg Implementation fixiert um das zu bemerken <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f621.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--pouting_face"
      title=":rage:"
      alt="😡"
    /></p>
<p>Das mit dem Verketten verstehe ich nur so halbwegs.<br />
Hast du mir ein kleines Beispiel oder nen Link?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1271713</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1271713</guid><dc:creator><![CDATA[xGhost]]></dc:creator><pubDate>Mon, 23 Apr 2007 12:26:44 GMT</pubDate></item><item><title><![CDATA[Reply to template fehler... aber warum? on Mon, 23 Apr 2007 13:05:52 GMT]]></title><description><![CDATA[<p>Hi,</p>
<p>naja, wie z.B. bei der Ausgabe auf Konsole oder File:</p>
<pre><code class="language-cpp">class MyClass {
   int myInt;
public:
   MyClass(int i) myInt(i) {}
   virtual ostream&amp; print(ostream&amp; out) const { 
      return out &lt;&lt; &quot;MyClass: &quot; &lt;&lt; myInt; 
   }
};

// &quot;freier&quot; Operator ist handlicher (brauch nur einen für alle Abkömmlinge von myClass
ostream&amp; operator&lt;&lt;(ostream&amp; out, MyClass const&amp; m) { return m.print(out); }

int main() {
   MyClass a(1);
   MyClass b(2);

   // auf Konsole ...
   cout &lt;&lt; &quot;Hallo &quot; &lt;&lt; &quot;xGhost&quot; &lt;&lt; 3 &lt;&lt; a &lt;&lt; &quot;\n&quot;;
   // ... oder in File
   ofstream out(&quot;file.txt&quot;);
   out &lt;&lt; &quot;ins File &quot; &lt;&lt; &quot;geht  auch die&quot; &lt;&lt; b &lt;&lt; &quot;\n&quot;;

   // schreibt sich einfach netter als
   cout &lt;&lt; &quot;Hallo &quot;;
   cout &lt;&lt; &quot;xGhost&quot;;
   cout &lt;&lt; 3;
   cout &lt;&lt; a;
   cout &lt;&lt; &quot;\n&quot;;
</code></pre>
<p>Das funktioniert, weil der betroffene Stream selbst zurückgegeben wird.</p>
<p>Ähnlich könntest Du Dein va_arg-Objekt zurückgeben:</p>
<pre><code class="language-cpp">struct va_arg {
   vector&lt;int&gt; v;
   va_arg&amp; operator&lt;&lt;(int arg) { v.push_back(arg); return *this; }
};

int main() {
   va_arg a;
   a &lt;&lt; 1 &lt;&lt; 2;
   copy(a.v.begin(), a.v.end(), std::ostream_iterator&lt;int&gt;(cout, &quot; &quot;) );   
   return 0;
}
</code></pre>
<p>Andererseits kommt man dann evtl. mit</p>
<pre><code class="language-cpp">cout &lt;&lt; a &lt;&lt; 3 &lt;&lt; &quot;\n&quot;;
</code></pre>
<p>ein wenig durcheinander..... (falls man noch den operator&lt;&lt;(ostream&amp;, ...) geeignet überlädt).</p>
<p>Gruß,</p>
<p>Simon2.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1271735</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1271735</guid><dc:creator><![CDATA[Simon2]]></dc:creator><pubDate>Mon, 23 Apr 2007 13:05:52 GMT</pubDate></item><item><title><![CDATA[Reply to template fehler... aber warum? on Mon, 23 Apr 2007 12:59:57 GMT]]></title><description><![CDATA[<p>Jo, das war der Teil, der mir klar war.<br />
Muss ich aber nur va_arg&amp; zurück geben, und Verkettung macht<br />
es von selbst, oder muss ich sonst noch einen anderen operator überladen?</p>
<p>// Edit //<br />
Dein edit gesehen, danke</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1271743</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1271743</guid><dc:creator><![CDATA[xGhost]]></dc:creator><pubDate>Mon, 23 Apr 2007 12:59:57 GMT</pubDate></item><item><title><![CDATA[Reply to template fehler... aber warum? on Tue, 24 Apr 2007 01:15:05 GMT]]></title><description><![CDATA[<p>&quot;%&quot; zum &quot;zeugs reinstecken&quot; wird auch z.B. von Boost.Regex verwendet. Ist also nicht GANZ so unüblich. Und keine Verwirrung mit den Streamoperatoren. Von daher... finde ich das nicht SO verkehrt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1272104</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1272104</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Tue, 24 Apr 2007 01:15:05 GMT</pubDate></item><item><title><![CDATA[Reply to template fehler... aber warum? on Tue, 24 Apr 2007 06:55:38 GMT]]></title><description><![CDATA[<p>hustbaer schrieb:</p>
<blockquote>
<p>&quot;%&quot; zum &quot;zeugs reinstecken&quot; wird auch z.B. von Boost.Regex verwendet. Ist also nicht GANZ so unüblich. ...</p>
</blockquote>
<p>OK, mir persönlich war das total unbekannt (hach - es gibt ja noch so Vieles, was ich noch nicht kenne ! <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f60b.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_savoring_food"
      title=":yum:"
      alt="😋"
    /> ) und ich bin eher übervorsichtig, was operator overloading angeht....</p>
<p>Ich hoffe, ich konnte trotzdem ein wenig weiterhelfen.</p>
<p>Gruß,</p>
<p>Simon2.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1272153</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1272153</guid><dc:creator><![CDATA[Simon2]]></dc:creator><pubDate>Tue, 24 Apr 2007 06:55:38 GMT</pubDate></item></channel></rss>