<?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[Linkerror bei Template Funktion]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich habe einen merkwürdigen Linkerror bei einer Template Funktion und so langsam bin ich mit meinem Latein am Ende - vielleicht hat ja hier noch jemand eine Idee.</p>
<p>Hintergrund:</p>
<p>Ziel ist es eine Template Funktion zu schreiben die sowohl std::list<a href="std::string" rel="nofollow">std::string</a> wie auch std::vector<a href="std::string" rel="nofollow">std::string</a> als Parameter akzeptiert.</p>
<p>Diese sieht dann so aus:</p>
<pre><code class="language-cpp">// implode
//
// -----------------------------------------------------------------------------
template&lt;class T&gt;
std::string Implode(const T&amp; inStringList, const std::string&amp; inGlue)
{
	std::string			output;
	typename T::const_iterator iter;

	int16	element = 0;

	for(iter = inStringList.begin(); iter != inStringList.end(); ++iter)
	{
		++element;

		output += *iter;
		if(element &lt;= inStringList.size() - 1)
			output += inGlue;
	}

	return output;
}
</code></pre>
<p>Die Funktion wird auch ohne Fehler kompiliert, nur dann bekomme ich Linkerrors und zwar an den Stellen wo ich die Funktion verwende:</p>
<blockquote>
<p>Link Error : undefined: 'std::string CDCX::Implode&lt;std::list&lt;std::string, std::allocator<a href="std::string" rel="nofollow">std::string</a> &gt; &gt;(const std::list&lt;std::string, std::allocator<a href="std::string" rel="nofollow">std::string</a> &gt;&amp;, const std::string&amp;)' (code)<br />
Referenced from 'CDataLookupASCIIDlg::ProcessASCIIDependenciesFile(HeaderFieldFocus*)' in D_DataLookupASCIIDlg.cpp<br />
Referenced from 'CDataLookupASCIIDlg::XDDoVerb(xdwapparamrec*)' in D_DataLookupASCIIDlg.cpp</p>
<p>Link Error : undefined: 'std::string CDCX::Implode&lt;std::vector&lt;std::string, std::allocator<a href="std::string" rel="nofollow">std::string</a> &gt; &gt;(const std::vector&lt;std::string, std::allocator<a href="std::string" rel="nofollow">std::string</a> &gt;&amp;, const std::string&amp;)' (code)<br />
Referenced from 'CDataLookupASCIIDlg::ProcessASCIIDependenciesFile(HeaderFieldFocus*)' in D_DataLookupASCIIDlg.cpp<br />
Referenced from 'CDataLookupHTTPDlg::XDDoVerb(xdwapparamrec*)' in D_DataLookupHTTPDlg.cpp<br />
Referenced from 'CDataLookupASCIIDlg::XDDoVerb(xdwapparamrec*)' in D_DataLookupASCIIDlg.cpp<br />
Referenced from 'CDataLookupASCIIDlg::ReadDataFile(const std::string&amp;)' in D_DataLookupASCIIDlg.cpp</p>
</blockquote>
<p>Wobei dies hier z.B. ein möglicher Aufruf ist (Zeile 16 bzw. 18):</p>
<pre><code class="language-cpp">std::map&lt;uint32, std::list&lt;std::string&gt; &gt;					fieldValueMap;
	std::map&lt;uint32, std::list&lt;std::string&gt;	&gt;::const_iterator	fieldValueIter;

for(fieldValueIter = fieldValueMap.begin(); fieldValueIter != fieldValueMap.end(); ++fieldValueIter)
	{
		std::vector&lt;std::string&gt;	oldRecords;

		if(setupSettings.mMultiValue)
		{
			std::string	oldFieldValue;
			gXTP-&gt;mDXTLinkP-&gt;GetFieldValue(fieldValueIter-&gt;first, oldFieldValue);

			size_t	numberOfRecords = CDCX::Explode(oldFieldValue, oldRecords, *(recordSeparator.c_str()), false);

			if(mFieldNumber &lt; oldRecords.size())							
				oldRecords.at(mFieldNumber) = CDCX::Implode(fieldValueIter-&gt;second, fieldSeparator);
			else
				oldRecords.push_back(CDCX::Implode(fieldValueIter-&gt;second, fieldSeparator));
		}
		else
		{	
			oldRecords.push_back(CDCX::Implode(fieldValueIter-&gt;second, fieldSeparator));
		}

		gXTP-&gt;mDXTLinkP-&gt;SetFieldValue(fieldValueIter-&gt;first, CDCX::Implode(oldRecords, recordSeparator)); 	
	}
</code></pre>
<p>MacDisein</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/200842/linkerror-bei-template-funktion</link><generator>RSS for Node</generator><lastBuildDate>Mon, 05 Oct 2026 03:09:28 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/200842.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 20 Dec 2007 11:41:42 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Linkerror bei Template Funktion on Thu, 20 Dec 2007 11:43:22 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich habe einen merkwürdigen Linkerror bei einer Template Funktion und so langsam bin ich mit meinem Latein am Ende - vielleicht hat ja hier noch jemand eine Idee.</p>
<p>Hintergrund:</p>
<p>Ziel ist es eine Template Funktion zu schreiben die sowohl std::list<a href="std::string" rel="nofollow">std::string</a> wie auch std::vector<a href="std::string" rel="nofollow">std::string</a> als Parameter akzeptiert.</p>
<p>Diese sieht dann so aus:</p>
<pre><code class="language-cpp">// implode
//
// -----------------------------------------------------------------------------
template&lt;class T&gt;
std::string Implode(const T&amp; inStringList, const std::string&amp; inGlue)
{
	std::string			output;
	typename T::const_iterator iter;

	int16	element = 0;

	for(iter = inStringList.begin(); iter != inStringList.end(); ++iter)
	{
		++element;

		output += *iter;
		if(element &lt;= inStringList.size() - 1)
			output += inGlue;
	}

	return output;
}
</code></pre>
<p>Die Funktion wird auch ohne Fehler kompiliert, nur dann bekomme ich Linkerrors und zwar an den Stellen wo ich die Funktion verwende:</p>
<blockquote>
<p>Link Error : undefined: 'std::string CDCX::Implode&lt;std::list&lt;std::string, std::allocator<a href="std::string" rel="nofollow">std::string</a> &gt; &gt;(const std::list&lt;std::string, std::allocator<a href="std::string" rel="nofollow">std::string</a> &gt;&amp;, const std::string&amp;)' (code)<br />
Referenced from 'CDataLookupASCIIDlg::ProcessASCIIDependenciesFile(HeaderFieldFocus*)' in D_DataLookupASCIIDlg.cpp<br />
Referenced from 'CDataLookupASCIIDlg::XDDoVerb(xdwapparamrec*)' in D_DataLookupASCIIDlg.cpp</p>
<p>Link Error : undefined: 'std::string CDCX::Implode&lt;std::vector&lt;std::string, std::allocator<a href="std::string" rel="nofollow">std::string</a> &gt; &gt;(const std::vector&lt;std::string, std::allocator<a href="std::string" rel="nofollow">std::string</a> &gt;&amp;, const std::string&amp;)' (code)<br />
Referenced from 'CDataLookupASCIIDlg::ProcessASCIIDependenciesFile(HeaderFieldFocus*)' in D_DataLookupASCIIDlg.cpp<br />
Referenced from 'CDataLookupHTTPDlg::XDDoVerb(xdwapparamrec*)' in D_DataLookupHTTPDlg.cpp<br />
Referenced from 'CDataLookupASCIIDlg::XDDoVerb(xdwapparamrec*)' in D_DataLookupASCIIDlg.cpp<br />
Referenced from 'CDataLookupASCIIDlg::ReadDataFile(const std::string&amp;)' in D_DataLookupASCIIDlg.cpp</p>
</blockquote>
<p>Wobei dies hier z.B. ein möglicher Aufruf ist (Zeile 16 bzw. 18):</p>
<pre><code class="language-cpp">std::map&lt;uint32, std::list&lt;std::string&gt; &gt;					fieldValueMap;
	std::map&lt;uint32, std::list&lt;std::string&gt;	&gt;::const_iterator	fieldValueIter;

for(fieldValueIter = fieldValueMap.begin(); fieldValueIter != fieldValueMap.end(); ++fieldValueIter)
	{
		std::vector&lt;std::string&gt;	oldRecords;

		if(setupSettings.mMultiValue)
		{
			std::string	oldFieldValue;
			gXTP-&gt;mDXTLinkP-&gt;GetFieldValue(fieldValueIter-&gt;first, oldFieldValue);

			size_t	numberOfRecords = CDCX::Explode(oldFieldValue, oldRecords, *(recordSeparator.c_str()), false);

			if(mFieldNumber &lt; oldRecords.size())							
				oldRecords.at(mFieldNumber) = CDCX::Implode(fieldValueIter-&gt;second, fieldSeparator);
			else
				oldRecords.push_back(CDCX::Implode(fieldValueIter-&gt;second, fieldSeparator));
		}
		else
		{	
			oldRecords.push_back(CDCX::Implode(fieldValueIter-&gt;second, fieldSeparator));
		}

		gXTP-&gt;mDXTLinkP-&gt;SetFieldValue(fieldValueIter-&gt;first, CDCX::Implode(oldRecords, recordSeparator)); 	
	}
</code></pre>
<p>MacDisein</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1423702</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1423702</guid><dc:creator><![CDATA[MacDisein]]></dc:creator><pubDate>Thu, 20 Dec 2007 11:43:22 GMT</pubDate></item><item><title><![CDATA[Reply to Linkerror bei Template Funktion on Thu, 20 Dec 2007 11:52:30 GMT]]></title><description><![CDATA[<p>*tief durchatmet* Um die Template-Methode anlegen zu können, muß der Compiler ihren Inhalt (Definition) und ihre Instanziierung (Verwendung) gleichzeitig sehen. Darum gehören Template-Implementierungen (grundsätzlich) in den Header.</p>
<p>(beim Übersetzen der Implode() weiß der Compiler nicht, ob er später die Implode&lt;vector&lt;string&gt; &gt;, Implode&lt;list&lt;int&gt; &gt; oder Implode&lt;Hundekuchen&gt; benötigen wird, also kontrolliert er nur auf syntaktische Fehler - beim Übersetzen des Hauptprogramms weiß er nicht, wie die Funktion aufgebaut ist)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1423713</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1423713</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Thu, 20 Dec 2007 11:52:30 GMT</pubDate></item><item><title><![CDATA[Reply to Linkerror bei Template Funktion on Thu, 20 Dec 2007 12:01:45 GMT]]></title><description><![CDATA[<p>Im Header war die Funktion auch als Template Funktion definiert, ich hatte erwartet, dass das ausreichen würde.</p>
<pre><code class="language-cpp">template&lt;class T&gt;
std::string Implode(const T&amp; inStringList, const std::string&amp; inGlue)
</code></pre>
<p>Jetzt wo auch die Implementierung im Header ist gibt es auch keine Linkerrors mehr - wieder was dazugelernt.</p>
<p>Thema kann geschlossen werden!</p>
<p>Vielen Dank für die super schnelle Hilfe!</p>
<p>MacDisein</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1423723</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1423723</guid><dc:creator><![CDATA[MacDisein]]></dc:creator><pubDate>Thu, 20 Dec 2007 12:01:45 GMT</pubDate></item></channel></rss>