<?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 Friend]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich mal einen kompilierfähigen Beispielcode zusammengestellt, der mein Problem ganz gut darlegt:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;exception&gt;

using namespace std;

template&lt;typename _Ty, size_t _n&gt;
class BoundArray
{
private:
	size_t _last_idx;
	_Ty _arr[_n];

public:
	_Ty operator[] (size_t idx)
	{
		this-&gt;_last_idx = idx;
		if( idx &lt; _n )
			return this-&gt;_arr[idx];
		else
			throw out_of_range(&quot;idx is out of range&quot;);
	}

	template&lt;typename __Ty, size_t __n&gt;
	friend _Ty GetFromArray(BoundArray&lt;__Ty, __n&gt;&amp;, size_t);
};

template&lt;typename _Ty, size_t _n&gt;
_Ty GetFromArray(BoundArray&lt;_Ty, _n&gt;&amp; arr, size_t idx)
{
	_Ty ret_val;
	try
	{
		ret_val = arr[idx];
	}
	catch(out_of_range e)
	{
		memset(&amp;ret_val, 0, sizeof(_Ty));
		cout &lt;&lt; e.what() &lt;&lt; endl;
		cout &lt;&lt; arr._last_idx &lt;&lt; endl;
	}

	return ret_val;
}

int main()
{
	BoundArray&lt;int, 20&gt; arr;

	for( int i = 0; i &lt; 30; i++ )
		cout &lt;&lt; GetFromArray(arr, i) &lt;&lt; endl;

	return 0;
}
</code></pre>
<p>Die Funktion GetFromArray() soll auf die private Member von BoundArray zugreifen können. Ich kam jedoch nicht umher extra template&lt;typename, size_t&gt; vor die friend deklaration schreiben zu müssen.<br />
Warum kann ich nicht einfach</p>
<pre><code class="language-cpp">friend _Ty GetFromArray(BoundArray&lt;_Ty, _n&gt;&amp;, size_t);
</code></pre>
<p>verwenden?</p>
<p>Es ist doch korrekt, dass speziell zu dieser speziellen Klasse GetFromArray() eine Friend Routine sein soll.</p>
<p>Ich bekomm dann aber nicht aufgelöste Verweise:</p>
<pre><code>error LNK2019: unresolved external symbol &quot;int __cdecl GetFromArray(class BoundArray&lt;int,20&gt; &amp;,unsigned int)&quot; (?GetFromArray@@YAHAAV?$BoundArray@H$0BE@@@I@Z) referenced in function _main	main.obj
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/topic/264747/templates-friend</link><generator>RSS for Node</generator><lastBuildDate>Tue, 28 Jul 2026 22:03:54 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/264747.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 12 Apr 2010 11:14:50 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Templates Friend on Mon, 12 Apr 2010 11:17:33 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich mal einen kompilierfähigen Beispielcode zusammengestellt, der mein Problem ganz gut darlegt:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;exception&gt;

using namespace std;

template&lt;typename _Ty, size_t _n&gt;
class BoundArray
{
private:
	size_t _last_idx;
	_Ty _arr[_n];

public:
	_Ty operator[] (size_t idx)
	{
		this-&gt;_last_idx = idx;
		if( idx &lt; _n )
			return this-&gt;_arr[idx];
		else
			throw out_of_range(&quot;idx is out of range&quot;);
	}

	template&lt;typename __Ty, size_t __n&gt;
	friend _Ty GetFromArray(BoundArray&lt;__Ty, __n&gt;&amp;, size_t);
};

template&lt;typename _Ty, size_t _n&gt;
_Ty GetFromArray(BoundArray&lt;_Ty, _n&gt;&amp; arr, size_t idx)
{
	_Ty ret_val;
	try
	{
		ret_val = arr[idx];
	}
	catch(out_of_range e)
	{
		memset(&amp;ret_val, 0, sizeof(_Ty));
		cout &lt;&lt; e.what() &lt;&lt; endl;
		cout &lt;&lt; arr._last_idx &lt;&lt; endl;
	}

	return ret_val;
}

int main()
{
	BoundArray&lt;int, 20&gt; arr;

	for( int i = 0; i &lt; 30; i++ )
		cout &lt;&lt; GetFromArray(arr, i) &lt;&lt; endl;

	return 0;
}
</code></pre>
<p>Die Funktion GetFromArray() soll auf die private Member von BoundArray zugreifen können. Ich kam jedoch nicht umher extra template&lt;typename, size_t&gt; vor die friend deklaration schreiben zu müssen.<br />
Warum kann ich nicht einfach</p>
<pre><code class="language-cpp">friend _Ty GetFromArray(BoundArray&lt;_Ty, _n&gt;&amp;, size_t);
</code></pre>
<p>verwenden?</p>
<p>Es ist doch korrekt, dass speziell zu dieser speziellen Klasse GetFromArray() eine Friend Routine sein soll.</p>
<p>Ich bekomm dann aber nicht aufgelöste Verweise:</p>
<pre><code>error LNK2019: unresolved external symbol &quot;int __cdecl GetFromArray(class BoundArray&lt;int,20&gt; &amp;,unsigned int)&quot; (?GetFromArray@@YAHAAV?$BoundArray@H$0BE@@@I@Z) referenced in function _main	main.obj
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1881495</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1881495</guid><dc:creator><![CDATA[FrEEzE2046]]></dc:creator><pubDate>Mon, 12 Apr 2010 11:17:33 GMT</pubDate></item><item><title><![CDATA[Reply to Templates Friend on Mon, 12 Apr 2010 13:09:13 GMT]]></title><description><![CDATA[<p>FrEEzE2046 schrieb:</p>
<blockquote>
<p>Warum kann ich nicht einfach</p>
<pre><code class="language-cpp">friend _Ty GetFromArray(BoundArray&lt;_Ty, _n&gt;&amp;, size_t);
</code></pre>
<p>verwenden?</p>
</blockquote>
<p>Kasnnst du, das deklariert allerdings eine normale nicht-Template-Funktion als friend.<br />
Du kannst eine Spezialisierung als friend deklarieren, dann muss aber nat. das Primärtemplate zuvor schon deklariert worden sein.</p>
<p>FrEEzE2046 schrieb:</p>
<blockquote>
<p>Ich bekomm dann aber nicht aufgelöste Verweise:</p>
<pre><code>error LNK2019: unresolved external symbol &quot;int __cdecl GetFromArray(class BoundArray&lt;int,20&gt; &amp;,unsigned int)&quot; (?GetFromArray@@YAHAAV?$BoundArray@H$0BE@@@I@Z) referenced in function _main	main.obj
</code></pre>
</blockquote>
<p>Das ist Folge eines einfachen Tippfehlers, der weitaus auffälliger wäre, wenn du nicht diese furchtbaren reservierten Bezeichner verwenden würdest (Unterstriche zählen).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1881576</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1881576</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Mon, 12 Apr 2010 13:09:13 GMT</pubDate></item><item><title><![CDATA[Reply to Templates Friend on Mon, 12 Apr 2010 13:10:54 GMT]]></title><description><![CDATA[<p>C++, where friends can touch your privates.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1881578</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1881578</guid><dc:creator><![CDATA[Janjan]]></dc:creator><pubDate>Mon, 12 Apr 2010 13:10:54 GMT</pubDate></item><item><title><![CDATA[Reply to Templates Friend on Mon, 12 Apr 2010 13:17:26 GMT]]></title><description><![CDATA[<p>Stolperfalle:<br />
Du benutzt memset in einer template Klasse/Funktion, ohne sicherzustellen, dass der Template Parameter tatsächlich ein POD ist. Kann schon mal in die Hose gehen...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1881584</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1881584</guid><dc:creator><![CDATA[DocShoe]]></dc:creator><pubDate>Mon, 12 Apr 2010 13:17:26 GMT</pubDate></item><item><title><![CDATA[Reply to Templates Friend on Mon, 12 Apr 2010 18:27:22 GMT]]></title><description><![CDATA[<p>camper schrieb:</p>
<blockquote>
<p>Das ist Folge eines einfachen Tippfehlers, der weitaus auffälliger wäre, wenn du nicht diese furchtbaren reservierten Bezeichner verwenden würdest</p>
</blockquote>
<p>Die STL des MS-Compilers ist kein gutes Stil-Vorbild. <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>camper schrieb:</p>
<blockquote>
<p>(Unterstriche zählen).</p>
</blockquote>
<p>Zählen reicht nicht:</p>
<blockquote>
<p>Each name that contains a double underscore (_ _) or <strong>begins with an underscore followed by an uppercase letter</strong> (2.11) is reserved to the implementation for any use</p>
</blockquote>
]]></description><link>https://www.c-plusplus.net/forum/post/1881741</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1881741</guid><dc:creator><![CDATA[Nukularfüsiker]]></dc:creator><pubDate>Mon, 12 Apr 2010 18:27:22 GMT</pubDate></item></channel></rss>