<?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[multiple definition of]]></title><description><![CDATA[<p>Ich verwende folgende externe Headerdatei: <a href="http://www.davekoelle.com/files/alphanum.hpp" rel="nofollow">http://www.davekoelle.com/files/alphanum.hpp</a></p>
<p>bisher hab ich sie einmal im Projekt verwendet (eingebunden in einer cpp) und es funktioniert wunderbar.<br />
Jetzt wollte ich sie an einer anderen Stelle wiederverwenden, allerdings eingebunden in einer Headerdatei, da templates im Spiel sind. Eigentlich ja kein Problem, da überall include-guards vorhanden sind.</p>
<p>die Templates sehen so aus:</p>
<pre><code class="language-cpp">template&lt;class T&gt;
struct CompareAsc
{
	bool operator() ( const T&amp; lhs, const T&amp; rhs )
	{
		return doj::alphanum_comp( lhs, rhs ) &lt; 0;
	}
};

template&lt;class T&gt;
struct CompareDesc
{
	bool operator() ( const T&amp; lhs, const T&amp; rhs )
	{
		return !CompareAsc&lt;T&gt;( lhs, rhs );
	}
};

template&lt;class T, class U, class V&gt;
void sortVec( std::vector&lt;const T*&gt;* vec, U(*func)(), const V&amp; comp )
{
	std::map&lt;U, T*, V&gt; tempSortMap;
	for ( typename std::vector&lt;const T*&gt;::iterator iter( vec-&gt;begin() ); iter != vec-&gt;end(); ++iter )
	{
		//...
	}
	//...
}
</code></pre>
<p>ich hoffe, der Code ist nicht allzu schlecht <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f921.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--clown_face"
      title=":clown:"
      alt="🤡"
    /></p>
<p>folgendes will ich damit erreichen: ich bekomme von einem anderen Teil des Programms Vektoren die vom Aufbau her zwar gleich, aber jedesmal andere Objekte beinhalten, die ich mit der oben verlinkten headerdatei sortieren will.<br />
Nach welchem Attribut genau die Objekte sortiert werden sollen, entscheidet der übergebene Funktionspointer (also ob jetzt nach <code>getNummer()</code> oder <code>getBezeichnung()</code> sortiert werden soll). Der letzte Parameter entscheidet, ob CompareAsc oder CompareDesc der Map als Ersatz für std:less&lt;&gt; übergeben werden.</p>
<p>Vom Grundprinzip her sollte es eigentlich funktionieren...</p>
<p>beim compilieren (bzw. genauer beim linken) kommen aber diverse &quot;multiple definition of&quot;, die sich alle auf die alphanum.hpp beziehen (alle alphanum_comp() werden insgesamt dreimal aufgelistet) <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="😕"
    /><br />
aber sollte das durch die include-guards nicht verhindert werden?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/245512/multiple-definition-of</link><generator>RSS for Node</generator><lastBuildDate>Fri, 18 Sep 2026 18:28:10 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/245512.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 15 Jul 2009 05:36:08 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to multiple definition of on Wed, 15 Jul 2009 05:36:08 GMT]]></title><description><![CDATA[<p>Ich verwende folgende externe Headerdatei: <a href="http://www.davekoelle.com/files/alphanum.hpp" rel="nofollow">http://www.davekoelle.com/files/alphanum.hpp</a></p>
<p>bisher hab ich sie einmal im Projekt verwendet (eingebunden in einer cpp) und es funktioniert wunderbar.<br />
Jetzt wollte ich sie an einer anderen Stelle wiederverwenden, allerdings eingebunden in einer Headerdatei, da templates im Spiel sind. Eigentlich ja kein Problem, da überall include-guards vorhanden sind.</p>
<p>die Templates sehen so aus:</p>
<pre><code class="language-cpp">template&lt;class T&gt;
struct CompareAsc
{
	bool operator() ( const T&amp; lhs, const T&amp; rhs )
	{
		return doj::alphanum_comp( lhs, rhs ) &lt; 0;
	}
};

template&lt;class T&gt;
struct CompareDesc
{
	bool operator() ( const T&amp; lhs, const T&amp; rhs )
	{
		return !CompareAsc&lt;T&gt;( lhs, rhs );
	}
};

template&lt;class T, class U, class V&gt;
void sortVec( std::vector&lt;const T*&gt;* vec, U(*func)(), const V&amp; comp )
{
	std::map&lt;U, T*, V&gt; tempSortMap;
	for ( typename std::vector&lt;const T*&gt;::iterator iter( vec-&gt;begin() ); iter != vec-&gt;end(); ++iter )
	{
		//...
	}
	//...
}
</code></pre>
<p>ich hoffe, der Code ist nicht allzu schlecht <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f921.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--clown_face"
      title=":clown:"
      alt="🤡"
    /></p>
<p>folgendes will ich damit erreichen: ich bekomme von einem anderen Teil des Programms Vektoren die vom Aufbau her zwar gleich, aber jedesmal andere Objekte beinhalten, die ich mit der oben verlinkten headerdatei sortieren will.<br />
Nach welchem Attribut genau die Objekte sortiert werden sollen, entscheidet der übergebene Funktionspointer (also ob jetzt nach <code>getNummer()</code> oder <code>getBezeichnung()</code> sortiert werden soll). Der letzte Parameter entscheidet, ob CompareAsc oder CompareDesc der Map als Ersatz für std:less&lt;&gt; übergeben werden.</p>
<p>Vom Grundprinzip her sollte es eigentlich funktionieren...</p>
<p>beim compilieren (bzw. genauer beim linken) kommen aber diverse &quot;multiple definition of&quot;, die sich alle auf die alphanum.hpp beziehen (alle alphanum_comp() werden insgesamt dreimal aufgelistet) <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="😕"
    /><br />
aber sollte das durch die include-guards nicht verhindert werden?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1743194</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1743194</guid><dc:creator><![CDATA[zwutz]]></dc:creator><pubDate>Wed, 15 Jul 2009 05:36:08 GMT</pubDate></item><item><title><![CDATA[Reply to multiple definition of on Wed, 15 Jul 2009 06:09:10 GMT]]></title><description><![CDATA[<p>Includeguards verhindern nur das mehrfache Einbinden innerhalb einer Übersetzungseinheit, bspw. wenn Du alphanum.hpp in zwei anderen Headerdateien einbindest. In mehreren Übersetzungseinheiten tut der Includeguard nichts, wäre auch fatal, da sonst ja die Deklarationen fehlen würden.</p>
<p>Ich nehme an, alphanum_comp ist weder Template noch Inline? (Mögliche Lösung in dieser Frage enthalten)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1743200</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1743200</guid><dc:creator><![CDATA[LordJaxom]]></dc:creator><pubDate>Wed, 15 Jul 2009 06:09:10 GMT</pubDate></item><item><title><![CDATA[Reply to multiple definition of on Wed, 15 Jul 2009 06:15:57 GMT]]></title><description><![CDATA[<p>Das Problem am header ist, wie bereits gesagt wurde, dass der Header die Implementation normaler Funktionen direkt enthält. Also entweder in hpp/cpp aufteilen oder mit den genannten Schlüsselwörtern reparieren.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1743201</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1743201</guid><dc:creator><![CDATA[otze]]></dc:creator><pubDate>Wed, 15 Jul 2009 06:15:57 GMT</pubDate></item><item><title><![CDATA[Reply to multiple definition of on Wed, 15 Jul 2009 06:24:46 GMT]]></title><description><![CDATA[<p>otze schrieb:</p>
<blockquote>
<p>Das Problem am header ist, wie bereits gesagt wurde, dass der Header die Implementation normaler Funktionen direkt enthält. Also entweder in hpp/cpp aufteilen oder mit den genannten Schlüsselwörtern reparieren.</p>
</blockquote>
<p>jetzt hats geklingelt... eigentlich ja klar.<br />
Und nachdem ich jetzt alle als inline definiert hab, gehts plötzlich <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
<p>vielen dank euch beiden für die Hilfe</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1743203</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1743203</guid><dc:creator><![CDATA[zwutz]]></dc:creator><pubDate>Wed, 15 Jul 2009 06:24:46 GMT</pubDate></item><item><title><![CDATA[Reply to multiple definition of on Wed, 15 Jul 2009 07:11:08 GMT]]></title><description><![CDATA[<p>Wie bereits gesagt wurde: Im Header werden Funktionen mit <em>external</em> linkage <em>definiert</em>, welche weder inline noch Templates sind (Verletzung der ODR-Regeln, falls das Ding in mehrere Übersetzungseinheiten eingebunden wird). Das macht man einfach nicht.</p>
<p>Anonyme Namensräume haben eigentlich in Header-Dateien auch nichts zu suchen. In diesem Fall könnte das sogar eine weitere Verletzung der ODR-Regeln sein, weil ein Funktionstemplate mit external linkage, die &quot;anonymen&quot; Funktionen aufrufen. Knackpunkt hier ist, dass so eine &quot;anonyme&quot; Funktion nicht einzigartig ist, sondern jede Übersetzungseinheit, eine eigene Version enthält (internal linkage). Das führt dann zu inkonsistenten Templatespezialisierungen über den Übersetzungseinheiten.</p>
<p>Gruß,<br />
SP</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1743223</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1743223</guid><dc:creator><![CDATA[Sebastian Pizer]]></dc:creator><pubDate>Wed, 15 Jul 2009 07:11:08 GMT</pubDate></item></channel></rss>