<?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[Friend-Templates und Member]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich versuche innerhalb einer (eig. zwei) Template-Funktion auf Member zuzugreifen. Das Ganze sieht ungefähr so aus:</p>
<pre><code>//Profile.hpp
class Database;

class Profile
{
	template &lt;typename T&gt;
	friend bool Database::loadSingleDataset (T&amp; outputData, std::string fieldName, keyType regKey);  //Fehler #2
	template &lt;&gt;
	friend bool Database::loadSingleDataset (std::string&amp; outputData, std::string fieldName, keyType regKey);  //Fehler #3 und #4
	friend bool Database::loadSingleProfile (Profile&amp; tempProfile, keyType&amp; regKey);

private:
	std::string profileName;
    //...
public:
    //...
};
</code></pre>
<pre><code>//Database.hpp

#include &quot;Profile.hpp&quot;

//...

class Database
{
private:
	template &lt;typename T&gt;
	bool loadSingleDataset (T&amp; outputData, std::string fieldName, keyType regKey)
	{
        //...
    }

	template &lt;&gt; //a template specialization
	bool loadSingleDataset (std::string&amp; outputData, std::string fieldName, keyType regKey)
	{
        //...
    }
//...
};
</code></pre>
<p>Hier will ich die Member an die Template-Funktion übergeben und dort ändern, was nicht geht:</p>
<pre><code>//Database.cpp

bool Database::loadSingleProfile (Profile&amp; tempProfile, keyType&amp; regKey)
{
	loadResult *= loadSingleDataset&lt;std::string&gt;(tempProfile.profileName, &quot;profileName&quot;, regKey);  //hier kommt Fehler #1
    //...
}
</code></pre>
<p>Ich erhalte gleich einen Haufen Fehlermeldungen, die auf dem 15. Blick immernoch keinen Sinn ergeben:</p>
<blockquote>
<p>database.cpp(78): error C2248: &quot;Profile::profileName&quot;: Kein Zugriff auf private Member, dessen Deklaration in der Profile-Klasse erfolgte.<br />
profile.hpp(19): error C2039: 'loadSingleDataset': Ist kein Element von 'Database'<br />
profile.hpp(21): error C2770: Ungültige explizite template-Argumente für &quot;bool loadSingleDataset(T &amp;,std::string,keyType)&quot;.<br />
profile.hpp(21): error C2027: Verwendung des undefinierten Typs &quot;Database&quot;</p>
</blockquote>
<p>Zur 1. FM: Die Spezialisierung ist doch auch ein Kumpel... Warum passt das dem Compiler nicht?<br />
Zur 2. FM: Nun das ist wirklich Käse.<br />
Zur 3. FM: Die Funktionssignaturen sind identisch.<br />
Zur 4. FM: Habe Database vorwärts deklariert.</p>
<p>Ich vermute, dass das Ganze auf die friend-Deklaration zurückzuführen ist, bin aber im Moment &quot;ursachenblind&quot; und kann die Fehler nicht nachvollziehen.<br />
Danke für eure Hilfe.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/313882/friend-templates-und-member</link><generator>RSS for Node</generator><lastBuildDate>Sun, 02 Aug 2026 07:26:31 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/313882.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 12 Feb 2013 22:41:46 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Friend-Templates und Member on Tue, 12 Feb 2013 22:41:46 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich versuche innerhalb einer (eig. zwei) Template-Funktion auf Member zuzugreifen. Das Ganze sieht ungefähr so aus:</p>
<pre><code>//Profile.hpp
class Database;

class Profile
{
	template &lt;typename T&gt;
	friend bool Database::loadSingleDataset (T&amp; outputData, std::string fieldName, keyType regKey);  //Fehler #2
	template &lt;&gt;
	friend bool Database::loadSingleDataset (std::string&amp; outputData, std::string fieldName, keyType regKey);  //Fehler #3 und #4
	friend bool Database::loadSingleProfile (Profile&amp; tempProfile, keyType&amp; regKey);

private:
	std::string profileName;
    //...
public:
    //...
};
</code></pre>
<pre><code>//Database.hpp

#include &quot;Profile.hpp&quot;

//...

class Database
{
private:
	template &lt;typename T&gt;
	bool loadSingleDataset (T&amp; outputData, std::string fieldName, keyType regKey)
	{
        //...
    }

	template &lt;&gt; //a template specialization
	bool loadSingleDataset (std::string&amp; outputData, std::string fieldName, keyType regKey)
	{
        //...
    }
//...
};
</code></pre>
<p>Hier will ich die Member an die Template-Funktion übergeben und dort ändern, was nicht geht:</p>
<pre><code>//Database.cpp

bool Database::loadSingleProfile (Profile&amp; tempProfile, keyType&amp; regKey)
{
	loadResult *= loadSingleDataset&lt;std::string&gt;(tempProfile.profileName, &quot;profileName&quot;, regKey);  //hier kommt Fehler #1
    //...
}
</code></pre>
<p>Ich erhalte gleich einen Haufen Fehlermeldungen, die auf dem 15. Blick immernoch keinen Sinn ergeben:</p>
<blockquote>
<p>database.cpp(78): error C2248: &quot;Profile::profileName&quot;: Kein Zugriff auf private Member, dessen Deklaration in der Profile-Klasse erfolgte.<br />
profile.hpp(19): error C2039: 'loadSingleDataset': Ist kein Element von 'Database'<br />
profile.hpp(21): error C2770: Ungültige explizite template-Argumente für &quot;bool loadSingleDataset(T &amp;,std::string,keyType)&quot;.<br />
profile.hpp(21): error C2027: Verwendung des undefinierten Typs &quot;Database&quot;</p>
</blockquote>
<p>Zur 1. FM: Die Spezialisierung ist doch auch ein Kumpel... Warum passt das dem Compiler nicht?<br />
Zur 2. FM: Nun das ist wirklich Käse.<br />
Zur 3. FM: Die Funktionssignaturen sind identisch.<br />
Zur 4. FM: Habe Database vorwärts deklariert.</p>
<p>Ich vermute, dass das Ganze auf die friend-Deklaration zurückzuführen ist, bin aber im Moment &quot;ursachenblind&quot; und kann die Fehler nicht nachvollziehen.<br />
Danke für eure Hilfe.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2298463</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2298463</guid><dc:creator><![CDATA[*Rewind*]]></dc:creator><pubDate>Tue, 12 Feb 2013 22:41:46 GMT</pubDate></item><item><title><![CDATA[Reply to Friend-Templates und Member on Tue, 12 Feb 2013 23:03:46 GMT]]></title><description><![CDATA[<p><s>Du musst die Klasse zum Kumpel machen und nicht die Member-Funktionen.</s></p>
<p>Äh, sry das war mist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2298467</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2298467</guid><dc:creator><![CDATA[ScottZhang]]></dc:creator><pubDate>Tue, 12 Feb 2013 23:03:46 GMT</pubDate></item><item><title><![CDATA[Reply to Friend-Templates und Member on Tue, 12 Feb 2013 23:08:11 GMT]]></title><description><![CDATA[<p>ScottZhang schrieb:</p>
<blockquote>
<p><s>Du musst die Klasse zum Kumpel machen und nicht die Member-Funktionen.</s></p>
<p>Äh, sry das war mist.</p>
</blockquote>
<p><s>Gibt's auch 'ne kleine Erklärung dazu? Das ist so ziemlich das, was ich vermeiden will. Ich will die Daten so viel wie möglich kapseln und solche offene Schnittstellen möglichst klein machen.</s><br />
Nevermind dann.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2298468</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2298468</guid><dc:creator><![CDATA[*Rewind*]]></dc:creator><pubDate>Tue, 12 Feb 2013 23:08:11 GMT</pubDate></item><item><title><![CDATA[Reply to Friend-Templates und Member on Tue, 12 Feb 2013 23:08:53 GMT]]></title><description><![CDATA[<p>Nee das war gerad nen Denkfehler von mir, natürlich kannst du auch nur die Memberfkt zum Kumpel machen.</p>
<p>Allerdings: warum gibst du die Spezialisierung nochmal als friend an?</p>
<p>Mit</p>
<pre><code>template &lt;typename T&gt;
    friend bool Database::loadSingleDataset (T&amp; outputData, std::string fieldName, keyType regKey);
</code></pre>
<p>ist doch alles gesagt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2298469</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2298469</guid><dc:creator><![CDATA[ScottZhang]]></dc:creator><pubDate>Tue, 12 Feb 2013 23:08:53 GMT</pubDate></item><item><title><![CDATA[Reply to Friend-Templates und Member on Wed, 13 Feb 2013 14:05:34 GMT]]></title><description><![CDATA[<p>Der Compiler weiß an der Stelle nur, dass es die Klasse Database gibt (dank der forward-deklaration), nicht aber welche Methoden sie hat. Jede <em>Behauptung</em> deinerseits bezüglich noch kommender Methodendeklarationen quittiert er deshalb mit einem Fehler. Die friend-Deklaration ist eine solche Behauptung.</p>
<p>Mein Tip: friend ist die stärkste Kupplung, die es in C++ überhaupt geben kann, in 90% der Fälle handelt es sich um fehlerhaftes oder zumindest fragliches Design. Überdenk nochmal dein Klassendesign <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>
]]></description><link>https://www.c-plusplus.net/forum/post/2298640</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2298640</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Wed, 13 Feb 2013 14:05:34 GMT</pubDate></item><item><title><![CDATA[Reply to Friend-Templates und Member on Wed, 13 Feb 2013 16:29:45 GMT]]></title><description><![CDATA[<p>Danke <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="😉"
    /> Ich erklär ganz kurz, was ich machen will. Im Prinzip soll in der Database-Klasse Profile (Datensätze) aud der DB geladen werden. Damit die Funktion, die die Daten für die Initialisierung eines Profils einliest und zum Verarbeitgen weitergibt, keine 10 pass-by-ref-Argumente bekommt, wollte ich gleich das zu erstellende Objekt übergeben. Ich fand die Verwendung von Kumpels hier nicht so dramatisch, weil zum Einen die friend-Funktion sowieso nichts anderes macht wie die Daten für das Profil-Objekt einlesen und zum Anderen &quot;Profil&quot; keine weiteren Member besitzt außer die, die aus der DB heraus initialisiert werden müssen.<br />
Was ich machen könnte, wäre den Profil-Ctor gleich in der <code>loadSingleDataset ()</code> aufrufen und einen Zeiger zurückgeben. Mal schauen. Danke schon mal.</p>
<p>Edit: Der Implikationen von friend bin ich mir bewusst. Wie ich schon sagte, ich wollte schon friends vermeiden, mir ist aber bis vorhin keine bessere Lösung eingefallen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2298686</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2298686</guid><dc:creator><![CDATA[*Rewind*]]></dc:creator><pubDate>Wed, 13 Feb 2013 16:29:45 GMT</pubDate></item></channel></rss>