<?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-Spezialisierung: const char* const&amp;amp; --&amp;gt; Linker-Fehler]]></title><description><![CDATA[<p>Bei VC++ und BCB gibt folgendes nen Linker-Fehler:</p>
<pre><code class="language-cpp">template&lt; typename T&gt;
void
foo( const T&amp; t);

 template&lt;&gt;
void
foo( const char*const&amp;)
{
}

int main()
{   
  foo( &quot;bla&quot;);
}
</code></pre>
<p>Fehlermeldung bei VC:</p>
<p>Nicht aufgelöstes externes Symbol '&quot;void __cdecl foo&lt;char const [4]&gt;(char const (&amp;)[4])&quot; (??<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>f</mi><mi>o</mi><mi>o</mi><mi mathvariant="normal">@</mi></mrow><annotation encoding="application/x-tex">foo@</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="strut" style="height:0.69444em;"></span><span class="strut bottom" style="height:0.8888799999999999em;vertical-align:-0.19444em;"></span><span class="base textstyle uncramped"><span class="mord mathit" style="margin-right:0.10764em;">f</span><span class="mord mathit">o</span><span class="mord mathit">o</span><span class="mord mathrm">@</span></span></span></span><span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>B</mi><mi>Y</mi><mn>0</mn><mn>3</mn></mrow><annotation encoding="application/x-tex">BY03</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="strut" style="height:0.68333em;"></span><span class="strut bottom" style="height:0.68333em;vertical-align:0em;"></span><span class="base textstyle uncramped"><span class="mord mathit" style="margin-right:0.05017em;">B</span><span class="mord mathit" style="margin-right:0.22222em;">Y</span><span class="mord mathrm">0</span><span class="mord mathrm">3</span></span></span></span><span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>C</mi><mi>B</mi><mi>D</mi><mi mathvariant="normal">@</mi><mi mathvariant="normal">@</mi><mi>Y</mi><mi>A</mi><mi>X</mi><mi>A</mi><mi>A</mi><mi>Y</mi><mn>0</mn><mn>3</mn></mrow><annotation encoding="application/x-tex">CBD@@YAXAAY03</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="strut" style="height:0.69444em;"></span><span class="strut bottom" style="height:0.69444em;vertical-align:0em;"></span><span class="base textstyle uncramped"><span class="mord mathit" style="margin-right:0.07153em;">C</span><span class="mord mathit" style="margin-right:0.05017em;">B</span><span class="mord mathit" style="margin-right:0.02778em;">D</span><span class="mord mathrm">@</span><span class="mord mathrm">@</span><span class="mord mathit" style="margin-right:0.22222em;">Y</span><span class="mord mathit">A</span><span class="mord mathit" style="margin-right:0.07847em;">X</span><span class="mord mathit">A</span><span class="mord mathit">A</span><span class="mord mathit" style="margin-right:0.22222em;">Y</span><span class="mord mathrm">0</span><span class="mord mathrm">3</span></span></span></span>$CBD@Z)', verwiesen in Funktion '_main'</p>
<p>Den BCB 'überred ich dazu, wenn ich</p>
<pre><code class="language-cpp">template&lt;&gt;
void
foo( char*const&amp;)
{
}
</code></pre>
<p>mache. Warum auch immer. Bei VC++ ändert das aber auch nix.<br />
Was mach ich, wenn meine Template-Funktoin const T&amp; kriegt, ich das ganze aber für T=const char* spezialisieren muss???</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/120841/template-spezialisierung-const-char-const-amp-gt-linker-fehler</link><generator>RSS for Node</generator><lastBuildDate>Sat, 22 Aug 2026 13:02:54 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/120841.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 16 Sep 2005 17:18:06 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Template-Spezialisierung: const char* const&amp;amp; --&amp;gt; Linker-Fehler on Fri, 16 Sep 2005 17:18:06 GMT]]></title><description><![CDATA[<p>Bei VC++ und BCB gibt folgendes nen Linker-Fehler:</p>
<pre><code class="language-cpp">template&lt; typename T&gt;
void
foo( const T&amp; t);

 template&lt;&gt;
void
foo( const char*const&amp;)
{
}

int main()
{   
  foo( &quot;bla&quot;);
}
</code></pre>
<p>Fehlermeldung bei VC:</p>
<p>Nicht aufgelöstes externes Symbol '&quot;void __cdecl foo&lt;char const [4]&gt;(char const (&amp;)[4])&quot; (??<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>f</mi><mi>o</mi><mi>o</mi><mi mathvariant="normal">@</mi></mrow><annotation encoding="application/x-tex">foo@</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="strut" style="height:0.69444em;"></span><span class="strut bottom" style="height:0.8888799999999999em;vertical-align:-0.19444em;"></span><span class="base textstyle uncramped"><span class="mord mathit" style="margin-right:0.10764em;">f</span><span class="mord mathit">o</span><span class="mord mathit">o</span><span class="mord mathrm">@</span></span></span></span><span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>B</mi><mi>Y</mi><mn>0</mn><mn>3</mn></mrow><annotation encoding="application/x-tex">BY03</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="strut" style="height:0.68333em;"></span><span class="strut bottom" style="height:0.68333em;vertical-align:0em;"></span><span class="base textstyle uncramped"><span class="mord mathit" style="margin-right:0.05017em;">B</span><span class="mord mathit" style="margin-right:0.22222em;">Y</span><span class="mord mathrm">0</span><span class="mord mathrm">3</span></span></span></span><span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>C</mi><mi>B</mi><mi>D</mi><mi mathvariant="normal">@</mi><mi mathvariant="normal">@</mi><mi>Y</mi><mi>A</mi><mi>X</mi><mi>A</mi><mi>A</mi><mi>Y</mi><mn>0</mn><mn>3</mn></mrow><annotation encoding="application/x-tex">CBD@@YAXAAY03</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="strut" style="height:0.69444em;"></span><span class="strut bottom" style="height:0.69444em;vertical-align:0em;"></span><span class="base textstyle uncramped"><span class="mord mathit" style="margin-right:0.07153em;">C</span><span class="mord mathit" style="margin-right:0.05017em;">B</span><span class="mord mathit" style="margin-right:0.02778em;">D</span><span class="mord mathrm">@</span><span class="mord mathrm">@</span><span class="mord mathit" style="margin-right:0.22222em;">Y</span><span class="mord mathit">A</span><span class="mord mathit" style="margin-right:0.07847em;">X</span><span class="mord mathit">A</span><span class="mord mathit">A</span><span class="mord mathit" style="margin-right:0.22222em;">Y</span><span class="mord mathrm">0</span><span class="mord mathrm">3</span></span></span></span>$CBD@Z)', verwiesen in Funktion '_main'</p>
<p>Den BCB 'überred ich dazu, wenn ich</p>
<pre><code class="language-cpp">template&lt;&gt;
void
foo( char*const&amp;)
{
}
</code></pre>
<p>mache. Warum auch immer. Bei VC++ ändert das aber auch nix.<br />
Was mach ich, wenn meine Template-Funktoin const T&amp; kriegt, ich das ganze aber für T=const char* spezialisieren muss???</p>
]]></description><link>https://www.c-plusplus.net/forum/post/873885</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/873885</guid><dc:creator><![CDATA[kartoffelsack]]></dc:creator><pubDate>Fri, 16 Sep 2005 17:18:06 GMT</pubDate></item><item><title><![CDATA[Reply to Template-Spezialisierung: const char* const&amp;amp; --&amp;gt; Linker-Fehler on Fri, 16 Sep 2005 17:26:17 GMT]]></title><description><![CDATA[<p>Willst du ne Refernz auf nen Pointer, nen const Pointer auf ne konstante Zeichenkette oder ganz einfach nur nen konstanten C-String empfangen?<br />
In der Reihenfolge und ohne Garantie, bin hundemüde:</p>
<pre><code class="language-cpp">template&lt;&gt;
void foo(const char *&amp; const str) {
  //..irgendwas machen
}

template&lt;&gt;
void foo(const char * const str) {
  //..irgendwas machen
}

template&lt;&gt;
void foo(const char *str) {
  //..irgendwas machen
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/873890</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/873890</guid><dc:creator><![CDATA[GPC]]></dc:creator><pubDate>Fri, 16 Sep 2005 17:26:17 GMT</pubDate></item><item><title><![CDATA[Reply to Template-Spezialisierung: const char* const&amp;amp; --&amp;gt; Linker-Fehler on Fri, 16 Sep 2005 17:37:36 GMT]]></title><description><![CDATA[<p>Ich will eigentlich nur einen ganz normalen konstanten oder nicht konstanten C-String übergeben.<br />
Das Problem ist, dass die vorgegebene Template-Funktion schon fest legt, dass es eine const Ref ist. -&gt; Logisch wär const char*const&amp;. Und eine const Referenz auf einen Zeiger müsste doch im Endeffekt dasselbe sein wie der Zeiger.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/873900</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/873900</guid><dc:creator><![CDATA[kartoffelsack]]></dc:creator><pubDate>Fri, 16 Sep 2005 17:37:36 GMT</pubDate></item><item><title><![CDATA[Reply to Template-Spezialisierung: const char* const&amp;amp; --&amp;gt; Linker-Fehler on Fri, 16 Sep 2005 17:44:01 GMT]]></title><description><![CDATA[<p>Ich will eigentlich nur einen ganz normalen konstanten oder nicht konstanten C-String übergeben.<br />
Das Problem ist, dass die vorgegebene Template-Funktion schon fest legt, dass es eine const Ref ist. -&gt; Logisch wär const char*const&amp;. Und eine const Referenz auf einen Zeiger müsste doch im Endeffekt dasselbe sein wie der Zeiger.</p>
<p>Versuchs jetzt mit ner normalen Überladung</p>
<pre><code class="language-cpp">void foo(const char *) { 
  //..irgendwas machen 
}

//oder
template&lt;&gt; 
void foo(const char * const&amp;) { 
  //..irgendwas machen 
}
</code></pre>
<p>Geht beides. Im Beispiel ... Mal schauen, was ich mir damit für neue Probs einhandle.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/873903</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/873903</guid><dc:creator><![CDATA[kartoffelsack]]></dc:creator><pubDate>Fri, 16 Sep 2005 17:44:01 GMT</pubDate></item><item><title><![CDATA[Reply to Template-Spezialisierung: const char* const&amp;amp; --&amp;gt; Linker-Fehler on Fri, 16 Sep 2005 19:18:54 GMT]]></title><description><![CDATA[<p>Funktionen müssen so gut wie nie spezialisiert wrden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/873982</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/873982</guid><dc:creator><![CDATA[ness]]></dc:creator><pubDate>Fri, 16 Sep 2005 19:18:54 GMT</pubDate></item><item><title><![CDATA[Reply to Template-Spezialisierung: const char* const&amp;amp; --&amp;gt; Linker-Fehler on Fri, 16 Sep 2005 19:35:04 GMT]]></title><description><![CDATA[<p>Außer, wenn man z.B. den Rückgabewert festlegen will (ich hab in wirlichkeit mehrere Template-Parameter). Aber ich kann auch ne Ausnahme machen und für const char* überladen.</p>
<p>Prinzipiell tät mich aber schon interessieren, warum das nicht geht. Standard-Conform wärs ja wohl, oder?</p>
<p>Voila:</p>
<p>7,8 h für die Portierung eines nicht so kleinen Konsolen-Projekts von Borland C++-Builder 5.5 nach VC 7.1. Zumindest compiliert und linkt es jetzt. 0 Fehler, 0 Warnungen. Hoffe keine Laufzeitfehler eingebaut zu haben. *puh* (ich mach das bestimmt nicht freiwillig)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/873989</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/873989</guid><dc:creator><![CDATA[kartoffelsack]]></dc:creator><pubDate>Fri, 16 Sep 2005 19:35:04 GMT</pubDate></item><item><title><![CDATA[Reply to Template-Spezialisierung: const char* const&amp;amp; --&amp;gt; Linker-Fehler on Fri, 16 Sep 2005 19:31:02 GMT]]></title><description><![CDATA[<p>Warum - du hast doch gesagt, dass überladen reicht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/873993</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/873993</guid><dc:creator><![CDATA[ness]]></dc:creator><pubDate>Fri, 16 Sep 2005 19:31:02 GMT</pubDate></item><item><title><![CDATA[Reply to Template-Spezialisierung: const char* const&amp;amp; --&amp;gt; Linker-Fehler on Fri, 16 Sep 2005 19:47:21 GMT]]></title><description><![CDATA[<p>Ja es geht, ist aber nicht analog zu anderen Teilen der Bibliothek und deswegen nicht so schön. Außerdem wird die Bibliothek in mehreren Projekten eingesetzt und und ich muss jetzt wegen des Verhaltens von VC und einer einzigen Applikation die Bibliothek ändern, ne neue Version rausbringen etc.. Und ich möcht wissen, warum es nicht geht, abgesehen davon, dass ichs umgehen kann.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/874004</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/874004</guid><dc:creator><![CDATA[kartoffelsack]]></dc:creator><pubDate>Fri, 16 Sep 2005 19:47:21 GMT</pubDate></item><item><title><![CDATA[Reply to Template-Spezialisierung: const char* const&amp;amp; --&amp;gt; Linker-Fehler on Sat, 17 Sep 2005 06:26:38 GMT]]></title><description><![CDATA[<p>(Sorry, dass fällt mir erst jetzt ein)<br />
Dann geh über strukturen:</p>
<pre><code class="language-cpp">namespace help
{
    template&lt;class T,class U&gt;
    struct specialise_h
    {
        typedef void ret;
        static ret foo(T t,U u)
        {
            //...
        };
    };

    template&lt;class T,class U&gt;
    struct specialise_h&lt;const T&amp;, U&gt;
    {
        typedef bool ret;
        ret foo(const T&amp; t,U u)
        {
            //...
            return x;
        };
    };
};

template&lt;class T,class U&gt;
typename help::specialie_h&lt;T,U&gt;::ret foo(T t,U u)
{
    return help::specialise_h::foo(t,u);
};
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/874123</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/874123</guid><dc:creator><![CDATA[ness]]></dc:creator><pubDate>Sat, 17 Sep 2005 06:26:38 GMT</pubDate></item><item><title><![CDATA[Reply to Template-Spezialisierung: const char* const&amp;amp; --&amp;gt; Linker-Fehler on Sat, 17 Sep 2005 07:20:03 GMT]]></title><description><![CDATA[<blockquote>
<p>Prinzipiell tät mich aber schon interessieren, warum das nicht geht. Standard-Conform wärs ja wohl, oder?</p>
</blockquote>
<p>Das geht nicht, da bei Referenzparametern in Templates kein &quot;decaying&quot; stattfindet.<br />
Was soviel bedeutet wie, dass ein Array in diesem Fall nicht in &quot;Zeiger auf das erste Element&quot; zerfällt. Dies wäre aber nötig, da ein Stringliteral den Typ const char[] hat und nicht const char*.</p>
<p>Für ein Stringliteral wird hier also das Base-Template und nicht die Spezialisierung ausgewählt. Weist du hingegen das Stringliteral zuvor einer Variablen vom Typ const char* zu, dann wird auch die Spezialisierung aufgerufen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/874135</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/874135</guid><dc:creator><![CDATA[HumeSikkins]]></dc:creator><pubDate>Sat, 17 Sep 2005 07:20:03 GMT</pubDate></item><item><title><![CDATA[Reply to Template-Spezialisierung: const char* const&amp;amp; --&amp;gt; Linker-Fehler on Sat, 17 Sep 2005 08:04:50 GMT]]></title><description><![CDATA[<p>Heißt das, er müsste noch für const char[] spezialisieren?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/874149</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/874149</guid><dc:creator><![CDATA[ness]]></dc:creator><pubDate>Sat, 17 Sep 2005 08:04:50 GMT</pubDate></item><item><title><![CDATA[Reply to Template-Spezialisierung: const char* const&amp;amp; --&amp;gt; Linker-Fehler on Sun, 18 Sep 2005 11:13:57 GMT]]></title><description><![CDATA[<p>ness schrieb:</p>
<blockquote>
<p>Heißt das, er müsste noch für const char[] spezialisieren?</p>
</blockquote>
<p>Der Typ von T ist hier const char[N], wobei N die Länge des Stringliterals ist. Für diesen Typen kannst du die Funktion so aber nicht spezialisieren, da du N nicht zur Verfügung hast.</p>
<p>Also: solange das Base-Template einen Referenzparameter enthält ist eine Spezialisierung für Stringliterale nicht möglich, da es für Funktionen keine partielle Spezialisierung gibt.</p>
<p>Man könnte die Funktion allerdings entsprechend überladen:</p>
<pre><code class="language-cpp">template &lt;int N&gt;
void foo(const char (&amp;a)[N]);
</code></pre>
<p>Wobei eine Überladung für const char* hier sicher angebrachter wäre.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/874812</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/874812</guid><dc:creator><![CDATA[HumeSikkins]]></dc:creator><pubDate>Sun, 18 Sep 2005 11:13:57 GMT</pubDate></item><item><title><![CDATA[Reply to Template-Spezialisierung: const char* const&amp;amp; --&amp;gt; Linker-Fehler on Sun, 18 Sep 2005 12:23:51 GMT]]></title><description><![CDATA[<p>Wenn er sicher gehen möchte soll er doch ne ganz normale Funktion draus machen.<br />
Bei der Auflösung von Überladungen spielen doch die spezialisierten Versionen erst dann eine Rolle wenn das &quot;passenste&quot; base template gefunden wurde.Wenn es von diesem base Template eine passende Spezialisierung gibt wird diese genommen und ansonsten eine generiert.<br />
Die ganze Spezialisierung von Funktionstemplates verhält sich etwas &quot;unnatürlich&quot;.</p>
<p>MfG Spacelord</p>
]]></description><link>https://www.c-plusplus.net/forum/post/874859</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/874859</guid><dc:creator><![CDATA[Spacelord]]></dc:creator><pubDate>Sun, 18 Sep 2005 12:23:51 GMT</pubDate></item><item><title><![CDATA[Reply to Template-Spezialisierung: const char* const&amp;amp; --&amp;gt; Linker-Fehler on Sun, 18 Sep 2005 14:10:55 GMT]]></title><description><![CDATA[<p>Überladen hab ich inzwischen. Und verstanden warum ichs machen muss auch. Danke! <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>
]]></description><link>https://www.c-plusplus.net/forum/post/874954</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/874954</guid><dc:creator><![CDATA[kartoffelsack]]></dc:creator><pubDate>Sun, 18 Sep 2005 14:10:55 GMT</pubDate></item></channel></rss>