<?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[templates + inline]]></title><description><![CDATA[<p>Hallo,</p>
<p>warum kann ich template-spezialisierungen mit inline verwenden?<br />
Mir ist klar dass wenn ich die spezialisierungen in die klasse (header) packe<br />
dass dann alles inline ist. aber warum kann ich es nicht außerhalb der klasse wie mit &quot;normalem&quot; template-freien code?</p>
<p>Hier ein Beispiel</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;

template&lt;class T&gt; class MyClass
{
        public:
            MyClass&lt;T&gt;() { }
        intline T foo() { };
};

template&lt;&gt; inline double MyClass&lt;double&gt;::foo()
{
        return 1.0;
}

template&lt;&gt; inline int MyClass&lt;int&gt;::foo()
{
        return 1;
}

int main(int argc, char *argv[])
{

  MyClass&lt;int&gt; m = MyClass&lt;int&gt;();
  std::cout &lt;&lt; m.foo() &lt;&lt; std::endl;
  return 0;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/topic/287570/templates-inline</link><generator>RSS for Node</generator><lastBuildDate>Thu, 20 Aug 2026 08:44:33 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/287570.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 31 May 2011 08:32:18 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to templates + inline on Tue, 31 May 2011 08:32:18 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>warum kann ich template-spezialisierungen mit inline verwenden?<br />
Mir ist klar dass wenn ich die spezialisierungen in die klasse (header) packe<br />
dass dann alles inline ist. aber warum kann ich es nicht außerhalb der klasse wie mit &quot;normalem&quot; template-freien code?</p>
<p>Hier ein Beispiel</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;

template&lt;class T&gt; class MyClass
{
        public:
            MyClass&lt;T&gt;() { }
        intline T foo() { };
};

template&lt;&gt; inline double MyClass&lt;double&gt;::foo()
{
        return 1.0;
}

template&lt;&gt; inline int MyClass&lt;int&gt;::foo()
{
        return 1;
}

int main(int argc, char *argv[])
{

  MyClass&lt;int&gt; m = MyClass&lt;int&gt;();
  std::cout &lt;&lt; m.foo() &lt;&lt; std::endl;
  return 0;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2071309</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2071309</guid><dc:creator><![CDATA[testo]]></dc:creator><pubDate>Tue, 31 May 2011 08:32:18 GMT</pubDate></item><item><title><![CDATA[Reply to templates + inline on Tue, 31 May 2011 08:38:59 GMT]]></title><description><![CDATA[<p>inline geht, intline nicht <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>
]]></description><link>https://www.c-plusplus.net/forum/post/2071311</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2071311</guid><dc:creator><![CDATA[manni66]]></dc:creator><pubDate>Tue, 31 May 2011 08:38:59 GMT</pubDate></item><item><title><![CDATA[Reply to templates + inline on Tue, 31 May 2011 08:42:15 GMT]]></title><description><![CDATA[<p>ah scheiße - danke</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2071313</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2071313</guid><dc:creator><![CDATA[testo]]></dc:creator><pubDate>Tue, 31 May 2011 08:42:15 GMT</pubDate></item><item><title><![CDATA[Reply to templates + inline on Tue, 31 May 2011 08:47:47 GMT]]></title><description><![CDATA[<p>testo schrieb:</p>
<blockquote>
<p>aber warum kann ich es nicht außerhalb der klasse wie mit &quot;normalem&quot; template-freien code?</p>
</blockquote>
<p>Kannst du doch.</p>
<p>(Die Antwort war jetzt ungefähr so informativ wie dein &quot;kann ich nicht&quot;. Ne Fehlermeldung wäre nächstemal Klasse ;))</p>
<p>Du kannst nur nicht <em>Teile</em> eines Klassentemplates spezialisieren, d.h. du musst das komplette Klassentemplate spezialisieren.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2071316</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2071316</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Tue, 31 May 2011 08:47:47 GMT</pubDate></item><item><title><![CDATA[Reply to templates + inline on Tue, 31 May 2011 09:44:48 GMT]]></title><description><![CDATA[<p>jetzt bin ich wieder verwirrt.<br />
was meinst du mit Teile eines klassentemplates?</p>
<p>ich habe jetzt das problem dass mein minimalbeispiel funktioniert aber mein Hauptcode wegen undefined references nicht linkt.</p>
<p>Also bei dem Minimalbeispiel gehts unten aber bei meinem hauptcode sobald ich da foo in bar() aufrufe schreit beim compilier bzw. linkervorgang mit<br />
undefined reference to.</p>
<p>Deshalb meine Frage: Was könnte ich übersehen haben im hauptcode?</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;

template&lt;class T&gt; class MyClass
{
        public:
            MyClass&lt;T&gt;() { }
        inline double foo() { };
        void bar();
};

template&lt;&gt; inline double MyClass&lt;double&gt;::foo()
{
        return 1.0;
}

template&lt;&gt; inline double MyClass&lt;int&gt;::foo()
{
        return 1.0;
}

template&lt;class T&gt; void MyClass&lt;T&gt;::bar()
{
        double a = foo();
        std::cout &lt;&lt; a &lt;&lt; std::endl;
}

int main(int argc, char *argv[])
{

  MyClass&lt;int&gt; m = MyClass&lt;int&gt;();
  m.bar();
  return 0;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2071343</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2071343</guid><dc:creator><![CDATA[testo]]></dc:creator><pubDate>Tue, 31 May 2011 09:44:48 GMT</pubDate></item><item><title><![CDATA[Reply to templates + inline on Tue, 31 May 2011 10:26:48 GMT]]></title><description><![CDATA[<p>testo schrieb:</p>
<blockquote>
<p>Also bei dem Minimalbeispiel gehts unten aber bei meinem hauptcode sobald ich da foo in bar() aufrufe schreit beim compilier bzw. linkervorgang mit<br />
undefined reference to.</p>
</blockquote>
<p>Bitte liefere uns die <strong>komplette</strong> Fehlermeldung, nicht nur das &quot;undefined reference to&quot;. Sonst kann man nur raten was schief läuft.</p>
<p>Hast du die kompletten Template-Definitionen im Header?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2071359</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2071359</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Tue, 31 May 2011 10:26:48 GMT</pubDate></item><item><title><![CDATA[Reply to templates + inline on Tue, 31 May 2011 10:30:24 GMT]]></title><description><![CDATA[<p>testo schrieb:</p>
<blockquote>
<p>jetzt bin ich wieder verwirrt.<br />
was meinst du mit Teile eines klassentemplates?</p>
</blockquote>
<p>Hab ich mich wohl geirrt, ich war der Meinung, du könntest nicht nur eine Methode des template spezialisieren sondern müsstest wenn dann die ganze Klasse spezialisieren. Offenbar kann zumindest gcc das aber doch...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2071361</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2071361</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Tue, 31 May 2011 10:30:24 GMT</pubDate></item><item><title><![CDATA[Reply to templates + inline on Tue, 31 May 2011 11:03:36 GMT]]></title><description><![CDATA[<p>bitte um entschuldigung aber ich kann den ganzen code nicht posten.</p>
<pre><code>Hast du die kompletten Template-Definitionen im Header?
</code></pre>
<p>ich muss doch gar nicht die ganze definition im header haben oder?<br />
lagere ich z.B. dashier in ein cpp file:</p>
<pre><code class="language-cpp">#include &quot;MyClass.h&quot;

template&lt;&gt; inline double MyClass&lt;double&gt;::foo()
{
        return 1.0;
}

template&lt;&gt; inline double MyClass&lt;int&gt;::foo()
{
        return 1.0;
}
</code></pre>
<p>und das hier in ein imp.h file:</p>
<pre><code class="language-cpp">template&lt;class T&gt; void MyClass&lt;T&gt;::bar()
{
    double a = foo();
    std::cout &lt;&lt; a &lt;&lt; std::endl;
}
</code></pre>
<p>und mein MyClass.h sieht so aus:</p>
<pre><code class="language-cpp">template&lt;class T&gt; class MyClass
{
    public:
        MyClass&lt;T&gt;() { }
    inline double foo() { };
    void bar();
};

#include &quot;MyClass.imp.h&quot;
</code></pre>
<p>dann funktioniert alles. In meinem Hauptcode allerdings nicht. Dort MUSS ich seltsamerweise was mich eben verwirrt <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /> die Definition im Header drin stehen haben mit inline. Dann kann ich mir aber eigentlich das inline doch sparen oder nicht?<br />
Also mein Problem liegt darin, dass das minimalbeispiel eben was anderes ausspuckt (korrekt) als mein Hauptcode (undefined reference).<br />
Ich hab im hauptcode nur eine ganz einfach template&lt;&gt; inline void MyClass&lt;int&gt;::test() funktion eingefügt ins cpp file. sobald ich test() einfach in einer funktion in der datei imp.h aufrufe gibts undefined reference.<br />
seltsam...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2071368</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2071368</guid><dc:creator><![CDATA[testo]]></dc:creator><pubDate>Tue, 31 May 2011 11:03:36 GMT</pubDate></item><item><title><![CDATA[Reply to templates + inline on Tue, 31 May 2011 11:18:39 GMT]]></title><description><![CDATA[<blockquote>
<p>Hast du die kompletten Template-Definitionen im Header?</p>
</blockquote>
<p>Genau das solltest du testen.</p>
<p>Es hat mal Versuche gegeben das anders zu realisieren. Die sind bei den Compileranbietern aber kaum umgesetzt und inzwischen wieder aus der C++ Norm entfernt. Kümmere mich wenig um diese Normen - hoffe das das passt.</p>
<p>MfG f.-th.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2071375</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2071375</guid><dc:creator><![CDATA[f.-th.]]></dc:creator><pubDate>Tue, 31 May 2011 11:18:39 GMT</pubDate></item><item><title><![CDATA[Reply to templates + inline on Tue, 31 May 2011 11:19:31 GMT]]></title><description><![CDATA[<p>testo schrieb:</p>
<blockquote>
<p>bitte um entschuldigung aber ich kann den ganzen code nicht posten.</p>
</blockquote>
<p>Die Fehlermeldung, nicht den Code. Den Code könntest du aufs Wesentliche reduzieren, d.h. unwichtige Dinge wegstreichen, so dass am Ende nur das problem übrig bleibt.</p>
<p>testo schrieb:</p>
<blockquote>
<pre><code>Hast du die kompletten Template-Definitionen im Header?
</code></pre>
<p>ich muss doch gar nicht die ganze definition im header haben oder?</p>
</blockquote>
<p>Indirekt schon. In deinem Fall kannst du vollständige Spezialisierungen (aber auch nur die) zwar in einer .cpp definieren, musst sie aber irgendwo deklarieren. Sonst weiß der Compiler beim Übersetzen nicht, dass es die Spezialisierungen gibt und instantiiert einfach das normale template, und das ist ja genau das, was du durch die Spezialisierungen ändern willst.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2071377</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2071377</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Tue, 31 May 2011 11:19:31 GMT</pubDate></item><item><title><![CDATA[Reply to templates + inline on Tue, 31 May 2011 11:21:59 GMT]]></title><description><![CDATA[<p>f.-th. schrieb:</p>
<blockquote>
<p>Es hat mal Versuche gegeben das anders zu realisieren. Die sind bei den Compileranbietern aber kaum umgesetzt und inzwischen wieder aus der C++ Norm entfernt. Kümmere mich wenig um diese Normen - hoffe das das passt.</p>
</blockquote>
<p>Es (das keyword export und die zugehörige Funktionalität) ist von exakt einem Compilerhersteller umgesetzt worden. Im kommenden C++0x-Standard ist export nicht mehr gültig (das keyword aber immernoh reserviert).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2071379</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2071379</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Tue, 31 May 2011 11:21:59 GMT</pubDate></item></channel></rss>