<?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[Externe Variable als Template-Argument]]></title><description><![CDATA[<p>Hi,</p>
<p>ich habe hier ein sehr fragwürdig programmiertes SDK zu einem Sensor vor mir, welches mir Probleme beim Kompilieren bereitet. Ich konnte die Problematik auf folgendes Minimalbeispiel reduzieren:</p>
<pre><code class="language-cpp">struct Descriptor
{
};

template &lt;Descriptor const&amp; D&gt;
struct Foo
{
	int bar()
	{
		return 0;
	}
};

extern &quot;C&quot;
{
	extern Descriptor const global_descr;
}

template&lt;&gt; inline int Foo&lt;global_descr&gt;::bar()
{
	return 1;
}

int main()
{
	return 0;
}
</code></pre>
<p>Problem: Es kompiliert unter GCC 4.3 bis 4.8 und 5.1 bis 5.2 sowie Clang, jedoch nicht unter GCC 4.9.*, welcher jedoch leider mein Zielcompiler ist. Hier ist die Fehlermeldung vom GCC 4.9.2:</p>
<pre><code>main.cpp:20:23: error: prototype for ‘int Foo&lt;D&gt;::bar() [with const Descriptor&amp; D = (* &amp; global_descr)]’ does not match any in class ‘Foo&lt;(* &amp; global_descr)&gt;’
 template&lt;&gt; inline int Foo&lt;global_descr&gt;::bar()
                       ^
main.cpp:8:6: error: candidate is: int Foo&lt;D&gt;::bar() [with const Descriptor&amp; D = (* &amp; global_descr)]
  int bar()
      ^
</code></pre>
<p>Ich verstehe nicht wirklich, was hier vor sich geht. Woher kennt der Compiler überhaupt die Adresse der externen Variable schon beim Kompilieren und kann so die explizite Template-Spezialisierung durchführen? Ich dachte, das wird erst vom Linker aufgelöst... Wieso kompiliert das ganze also mit den meisten GCC-Versionen? Wieso ausgerechnet mit der 4.9er nicht? Und was kann ich unter minimalinvasiven Gesichtspunkten unternehmen, damit es auch mit dem 4.9er tut? Die Library ist <em>riesig</em> und das Pattern zieht sich überall durch <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /></p>
<p>Grüße</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/334573/externe-variable-als-template-argument</link><generator>RSS for Node</generator><lastBuildDate>Sat, 25 Apr 2026 12:12:09 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/334573.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 23 Sep 2015 16:02:47 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Externe Variable als Template-Argument on Wed, 23 Sep 2015 16:05:06 GMT]]></title><description><![CDATA[<p>Hi,</p>
<p>ich habe hier ein sehr fragwürdig programmiertes SDK zu einem Sensor vor mir, welches mir Probleme beim Kompilieren bereitet. Ich konnte die Problematik auf folgendes Minimalbeispiel reduzieren:</p>
<pre><code class="language-cpp">struct Descriptor
{
};

template &lt;Descriptor const&amp; D&gt;
struct Foo
{
	int bar()
	{
		return 0;
	}
};

extern &quot;C&quot;
{
	extern Descriptor const global_descr;
}

template&lt;&gt; inline int Foo&lt;global_descr&gt;::bar()
{
	return 1;
}

int main()
{
	return 0;
}
</code></pre>
<p>Problem: Es kompiliert unter GCC 4.3 bis 4.8 und 5.1 bis 5.2 sowie Clang, jedoch nicht unter GCC 4.9.*, welcher jedoch leider mein Zielcompiler ist. Hier ist die Fehlermeldung vom GCC 4.9.2:</p>
<pre><code>main.cpp:20:23: error: prototype for ‘int Foo&lt;D&gt;::bar() [with const Descriptor&amp; D = (* &amp; global_descr)]’ does not match any in class ‘Foo&lt;(* &amp; global_descr)&gt;’
 template&lt;&gt; inline int Foo&lt;global_descr&gt;::bar()
                       ^
main.cpp:8:6: error: candidate is: int Foo&lt;D&gt;::bar() [with const Descriptor&amp; D = (* &amp; global_descr)]
  int bar()
      ^
</code></pre>
<p>Ich verstehe nicht wirklich, was hier vor sich geht. Woher kennt der Compiler überhaupt die Adresse der externen Variable schon beim Kompilieren und kann so die explizite Template-Spezialisierung durchführen? Ich dachte, das wird erst vom Linker aufgelöst... Wieso kompiliert das ganze also mit den meisten GCC-Versionen? Wieso ausgerechnet mit der 4.9er nicht? Und was kann ich unter minimalinvasiven Gesichtspunkten unternehmen, damit es auch mit dem 4.9er tut? Die Library ist <em>riesig</em> und das Pattern zieht sich überall durch <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /></p>
<p>Grüße</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2468890</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2468890</guid><dc:creator><![CDATA[Bloops]]></dc:creator><pubDate>Wed, 23 Sep 2015 16:05:06 GMT</pubDate></item><item><title><![CDATA[Reply to Externe Variable als Template-Argument on Wed, 23 Sep 2015 16:11:15 GMT]]></title><description><![CDATA[<p>bei mir</p>
<pre><code>g++ (Gentoo Hardened 4.9.3 p1.1, pie-0.6.2) 4.9.3
</code></pre>
<p>compiliert das.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2468891</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2468891</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Wed, 23 Sep 2015 16:11:15 GMT</pubDate></item><item><title><![CDATA[Reply to Externe Variable als Template-Argument on Wed, 23 Sep 2015 16:15:49 GMT]]></title><description><![CDATA[<p>Bloops schrieb:</p>
<blockquote>
<p>Woher kennt der Compiler überhaupt die Adresse der externen Variable schon beim Kompilieren und kann so die explizite Template-Spezialisierung durchführen?</p>
</blockquote>
<p>Die kennt er nicht und das muss er auch nicht. Der Compiler merkt sich einfach das Symbol, auf das verwiesen wird (ggf. +Offset, sofern legale Zeigerarithmetik verwendet wird). Und selbst der Linker kennt ja nicht in jedem Falle die finalen Adressen - die werden ggf. erst durch den Loader fixiert.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2468892</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2468892</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Wed, 23 Sep 2015 16:15:49 GMT</pubDate></item><item><title><![CDATA[Reply to Externe Variable als Template-Argument on Wed, 23 Sep 2015 16:57:24 GMT]]></title><description><![CDATA[<p>Ich konnte es nur mit GCC 4.9.0, 4.9.1 und 4.9.2 testen, welche alle drei nicht funktioniert haben. Habe nach deinem Hinweis mal in den GCC-Bugs geschaut, welche für 4.9.3 gefixt wurden. Und siehe da: <a href="https://gcc.gnu.org/bugzilla/show_bug.cgi?id=63658" rel="nofollow">Bug #63658</a>. Na wenn der Bug-Report mal nicht von dem SDK-Entwickler ist - man beachte die Ähnlichkeit zu meinem Minimalbeispiel <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>Dann muss ich also wohl einfach warten, bis der GCC 4.9.3 zu meiner Ubuntu-Version durchdiffundiert ist...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2468899</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2468899</guid><dc:creator><![CDATA[Bloops]]></dc:creator><pubDate>Wed, 23 Sep 2015 16:57:24 GMT</pubDate></item></channel></rss>