<?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[[SOLVED] Template-Spezialisierung für alle abgeleiteten Klassen]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>irgendwie kommt mir das Problem bekannt vor, finde aber keinen passenden Post.</p>
<p>Ich möchte, dass meine Template-Spezialisierung auch für alle davon abgeleiteten Klassen greift. Natürlich ist das eigentliche Problem komplexer, aber prinzipiell meine ich folgendes:</p>
<pre><code class="language-cpp">struct Foo{};

struct Bar : public Foo{};

template&lt;typename T&gt;
struct FooBar;

template&lt;&gt;
struct FooBar&lt;Foo&gt; {
	typedef int type;
};

int main(){
	FooBar&lt;Foo&gt;::type v1;
	FooBar&lt;Bar&gt;::type v2;
}
</code></pre>
<blockquote>
<p>test.cpp: In function 'int main()':<br />
test.cpp:15:2: error: incomplete type 'FooBar&lt;Bar&gt;' used in nested name specifier<br />
test.cpp:15:20: error: expected ';' before 'v2'</p>
</blockquote>
<p>Also ich möchte auf einen <code>typedef</code> zugreifen, was aber nur funktioniert<br />
wenn ich als Parameter an meine Template-Funktion genau ein Foo übergeben<br />
kriege, bei Bar greift die Template-Spezialisierung (verständlicherweise) nicht.<br />
Wie lautet der zu empfehlende Ansatz/Workaround?</p>
<p>Gruß,<br />
XSpille</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/294674/solved-template-spezialisierung-für-alle-abgeleiteten-klassen</link><generator>RSS for Node</generator><lastBuildDate>Sat, 15 Aug 2026 19:02:53 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/294674.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 30 Oct 2011 01:43:29 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to [SOLVED] Template-Spezialisierung für alle abgeleiteten Klassen on Sun, 30 Oct 2011 13:29:27 GMT]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>irgendwie kommt mir das Problem bekannt vor, finde aber keinen passenden Post.</p>
<p>Ich möchte, dass meine Template-Spezialisierung auch für alle davon abgeleiteten Klassen greift. Natürlich ist das eigentliche Problem komplexer, aber prinzipiell meine ich folgendes:</p>
<pre><code class="language-cpp">struct Foo{};

struct Bar : public Foo{};

template&lt;typename T&gt;
struct FooBar;

template&lt;&gt;
struct FooBar&lt;Foo&gt; {
	typedef int type;
};

int main(){
	FooBar&lt;Foo&gt;::type v1;
	FooBar&lt;Bar&gt;::type v2;
}
</code></pre>
<blockquote>
<p>test.cpp: In function 'int main()':<br />
test.cpp:15:2: error: incomplete type 'FooBar&lt;Bar&gt;' used in nested name specifier<br />
test.cpp:15:20: error: expected ';' before 'v2'</p>
</blockquote>
<p>Also ich möchte auf einen <code>typedef</code> zugreifen, was aber nur funktioniert<br />
wenn ich als Parameter an meine Template-Funktion genau ein Foo übergeben<br />
kriege, bei Bar greift die Template-Spezialisierung (verständlicherweise) nicht.<br />
Wie lautet der zu empfehlende Ansatz/Workaround?</p>
<p>Gruß,<br />
XSpille</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2137728</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2137728</guid><dc:creator><![CDATA[XSpille]]></dc:creator><pubDate>Sun, 30 Oct 2011 13:29:27 GMT</pubDate></item><item><title><![CDATA[Reply to [SOLVED] Template-Spezialisierung für alle abgeleiteten Klassen on Sun, 30 Oct 2011 02:01:04 GMT]]></title><description><![CDATA[<p>Ich weiß nicht, ob ich mich erinnert habe oder selbst den Einfall hatte:</p>
<pre><code class="language-cpp">#include &lt;boost/type_traits/is_base_of.hpp&gt;

struct Foo{};

struct Bar : public Foo{};

template&lt;typename T, bool B = boost::is_base_of&lt;Foo, T&gt;::value&gt;
struct FooBar;

template&lt;typename T&gt;
struct FooBar&lt;T,  true&gt; {
	typedef int type;
};

int main(){
	FooBar&lt;Foo&gt;::type v1;
	FooBar&lt;Bar&gt;::type v2;
}
</code></pre>
<p>Falls es doch noch eine elegantere Lösung gibt, bin ich dankbar <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>Gruß,<br />
XSpille</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2137732</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2137732</guid><dc:creator><![CDATA[XSpille]]></dc:creator><pubDate>Sun, 30 Oct 2011 02:01:04 GMT</pubDate></item><item><title><![CDATA[Reply to [SOLVED] Template-Spezialisierung für alle abgeleiteten Klassen on Sun, 30 Oct 2011 03:23:11 GMT]]></title><description><![CDATA[<p>Irgendwie komm ich nicht weiter...</p>
<p>also eigentlich wollte ich den angeführten Code für Template-Klassen mit variadic Parametern<br />
verwenden.</p>
<pre><code class="language-cpp">#include &lt;boost/type_traits/is_base_of.hpp&gt;

template&lt;typename... T&gt;
struct Foo{};

template&lt;typename... T&gt;
struct Bar : public Foo&lt;T...&gt;{};

template&lt;typename T, bool B = boost::is_base_of&lt;Foo&lt;...&gt;, T&gt;::value&gt; // Klar funct das '...' so nicht, aber es verdeutlicht wohl, was ich möchte
struct FooBar;

template&lt;typename T&gt;
struct FooBar&lt;T, true&gt; {
	typedef int type;
};

int main(){
	FooBar&lt;Foo&lt;int&gt; &gt;::type v1;
	FooBar&lt;Bar&lt;double&gt; &gt;::type v2;
}
</code></pre>
<p>Ich hoffe ihr versteht, was ich möchte.<br />
Habt ihr evtl. irgendwelche Lösungsideen/-vorschläge?</p>
<p>Gruß,<br />
XSpille</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2137735</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2137735</guid><dc:creator><![CDATA[XSpille]]></dc:creator><pubDate>Sun, 30 Oct 2011 03:23:11 GMT</pubDate></item><item><title><![CDATA[Reply to [SOLVED] Template-Spezialisierung für alle abgeleiteten Klassen on Sun, 30 Oct 2011 11:30:33 GMT]]></title><description><![CDATA[<p>spontan muss ich da an SFINAE denken...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2137808</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2137808</guid><dc:creator><![CDATA[bmario_]]></dc:creator><pubDate>Sun, 30 Oct 2011 11:30:33 GMT</pubDate></item><item><title><![CDATA[Reply to [SOLVED] Template-Spezialisierung für alle abgeleiteten Klassen on Sun, 30 Oct 2011 13:21:21 GMT]]></title><description><![CDATA[<p>Vielleicht mit eigenem is_derived_of_foo (ungetestet):</p>
<pre><code class="language-cpp">typedef char FalseType;
typedef struct{char s[2];} TrueType;

template&lt;typename... Templates&gt; TrueType is_derived_of_foo_function(Foo&lt;Templates...&gt; *ptr);
FalseType is_derived_of_foo_function(...);

template&lt;typename T&gt; class is_derived_of_foo
{
    static const bool value = (sizeof(is_derived_of_foo_function((T*)0)) == sizeof(TrueType);
}
</code></pre>
<p>Ich habe aber eine leise Vorahnung, dass das nicht gehen könnte.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2137830</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2137830</guid><dc:creator><![CDATA[wxSkip]]></dc:creator><pubDate>Sun, 30 Oct 2011 13:21:21 GMT</pubDate></item><item><title><![CDATA[Reply to [SOLVED] Template-Spezialisierung für alle abgeleiteten Klassen on Sun, 30 Oct 2011 13:09:52 GMT]]></title><description><![CDATA[<p>Wie wärs wenn du dein variadic class template von einer ganz normalen class ableitest?</p>
<pre><code class="language-cpp">class all_foo_base
{
};

template&lt; class ... &gt;
class Foo
    : all_foo_base
{
};
</code></pre>
<p>und dann einfach mit</p>
<pre><code class="language-cpp">is_base_of&lt; all_foo_base, T &gt;
</code></pre>
<p>überprüfen, ob T ein Foo&lt;...&gt; ist</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2137838</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2137838</guid><dc:creator><![CDATA[GorbGorb]]></dc:creator><pubDate>Sun, 30 Oct 2011 13:09:52 GMT</pubDate></item><item><title><![CDATA[Reply to [SOLVED] Template-Spezialisierung für alle abgeleiteten Klassen on Sun, 30 Oct 2011 13:25:44 GMT]]></title><description><![CDATA[<p>Ich danke euch beiden <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><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/23670">@wxSkip</a>: Abgesehen von 2 Kleinigkeiten, mußt nur eine Referenz zurückliefern (EDIT: FALSCH!!! siehe unten),<br />
aber ansonsten perfekt <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f44d.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--thumbs_up"
      title=":+1:"
      alt="👍"
    /></p>
<p>Hier noch 'meine' funktionierende Lösung:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;

template&lt;typename... T&gt;
struct Foo{};

template&lt;typename... T&gt;
struct Bar : public Foo&lt;T...&gt;{};

typedef char FalseType[1]; 
typedef char TrueType[2]; 

template&lt;typename... Templates&gt; TrueType&amp; is_derived_of_foo_function(Foo&lt;Templates...&gt; *ptr); 
FalseType&amp; is_derived_of_foo_function(...); 

template&lt;typename T&gt; struct is_derived_of_foo{ 
	static const bool value = (sizeof(is_derived_of_foo_function((T*)0)) == sizeof(TrueType)); 
};

template&lt;typename T, bool B = is_derived_of_foo&lt;T&gt;::value &gt;
struct FooBar;

template&lt;typename T&gt;
struct FooBar&lt;T, true&gt; {
	typedef int type;
};

int main(){
	std::cout &lt;&lt; is_derived_of_foo&lt;int&gt;::value &lt;&lt; std::endl;
	std::cout &lt;&lt; is_derived_of_foo&lt;Foo&lt;int&gt; &gt;::value &lt;&lt; std::endl;
	std::cout &lt;&lt; is_derived_of_foo&lt;Bar&lt;int&gt; &gt;::value &lt;&lt; std::endl;
	FooBar&lt;Foo&lt;int&gt; &gt;::type v1;
	FooBar&lt;Bar&lt;double&gt; &gt;::type v2;
}
</code></pre>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/26958">@GorbGorb</a>: Danke, aber ich wollte die Verwebungshierarchie nicht anpassen</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2137839</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2137839</guid><dc:creator><![CDATA[XSpille]]></dc:creator><pubDate>Sun, 30 Oct 2011 13:25:44 GMT</pubDate></item><item><title><![CDATA[Reply to [SOLVED] Template-Spezialisierung für alle abgeleiteten Klassen on Sun, 30 Oct 2011 13:15:32 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/24036">@XSpille</a>: Wozu die Referenz?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2137840</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2137840</guid><dc:creator><![CDATA[wxSkip]]></dc:creator><pubDate>Sun, 30 Oct 2011 13:15:32 GMT</pubDate></item><item><title><![CDATA[Reply to [SOLVED] Template-Spezialisierung für alle abgeleiteten Klassen on Sun, 30 Oct 2011 13:18:28 GMT]]></title><description><![CDATA[<p>wxSkip schrieb:</p>
<blockquote>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/24036">@XSpille</a>: Wozu die Referenz?</p>
</blockquote>
<p>Ehrlich gesagt: Keine Ahnung...</p>
<p>sonst kriegt man folgende Fehlermeldung, die ich ehrlich gesagt nicht ganz verstehe...</p>
<blockquote>
<p>test.cpp:12:91: error: 'is_derived_of_foo_function' declared as function returning an array<br />
test.cpp:13:41: error: 'is_derived_of_foo_function' declared as function returning an array</p>
</blockquote>
]]></description><link>https://www.c-plusplus.net/forum/post/2137841</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2137841</guid><dc:creator><![CDATA[XSpille]]></dc:creator><pubDate>Sun, 30 Oct 2011 13:18:28 GMT</pubDate></item><item><title><![CDATA[Reply to [SOLVED] Template-Spezialisierung für alle abgeleiteten Klassen on Sun, 30 Oct 2011 13:20:48 GMT]]></title><description><![CDATA[<p>XSpille schrieb:</p>
<blockquote>
<p>wxSkip schrieb:</p>
<blockquote>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/24036">@XSpille</a>: Wozu die Referenz?</p>
</blockquote>
<p>Ehrlich gesagt: Keine Ahnung...</p>
<p>sonst kriegt man folgende Fehlermeldung, die ich ehrlich gesagt nicht ganz verstehe...</p>
<blockquote>
<p>test.cpp:12:91: error: 'is_derived_of_foo_function' declared as function returning an array<br />
test.cpp:13:41: error: 'is_derived_of_foo_function' declared as function returning an array</p>
</blockquote>
</blockquote>
<p>Du darfst kein Array zurückgeben, deswegen habe ich auch ein struct darum gemacht... <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f644.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_rolling_eyes"
      title=":rolling_eyes:"
      alt="🙄"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2137842</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2137842</guid><dc:creator><![CDATA[wxSkip]]></dc:creator><pubDate>Sun, 30 Oct 2011 13:20:48 GMT</pubDate></item><item><title><![CDATA[Reply to [SOLVED] Template-Spezialisierung für alle abgeleiteten Klassen on Sun, 30 Oct 2011 13:24:53 GMT]]></title><description><![CDATA[<p>wxSkip schrieb:</p>
<blockquote>
<p>XSpille schrieb:</p>
<blockquote>
<p>wxSkip schrieb:</p>
<blockquote>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/24036">@XSpille</a>: Wozu die Referenz?</p>
</blockquote>
<p>Ehrlich gesagt: Keine Ahnung...</p>
<p>sonst kriegt man folgende Fehlermeldung, die ich ehrlich gesagt nicht ganz verstehe...</p>
<blockquote>
<p>test.cpp:12:91: error: 'is_derived_of_foo_function' declared as function returning an array<br />
test.cpp:13:41: error: 'is_derived_of_foo_function' declared as function returning an array</p>
</blockquote>
</blockquote>
<p>Du darfst kein Array zurückgeben, deswegen habe ich auch ein struct darum gemacht... <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f644.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_rolling_eyes"
      title=":rolling_eyes:"
      alt="🙄"
    /></p>
</blockquote>
<p>Ok... Du hast recht! Dann hab ich den Fehler reingemacht <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/2137845</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2137845</guid><dc:creator><![CDATA[XSpille]]></dc:creator><pubDate>Sun, 30 Oct 2011 13:24:53 GMT</pubDate></item><item><title><![CDATA[Reply to [SOLVED] Template-Spezialisierung für alle abgeleiteten Klassen on Sun, 30 Oct 2011 14:10:11 GMT]]></title><description><![CDATA[<p>Eine Frsge hab ich doch noch <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>Hat die Variante mit Hilfe von sizeof in C++0x einen Vorteil gegenüber der folgenden decltype-Version, die ich persönlich schöner finde:</p>
<pre><code class="language-cpp">typedef struct{} no; 
typedef struct{} yes;

template&lt;typename... T&gt;
struct Foo{};

template&lt;typename... T&gt;
struct Bar : public Foo&lt;T...&gt;{};

template&lt;typename... Templates&gt; yes is_derived_of_foo_function(Foo&lt;Templates...&gt; *ptr); 
no is_derived_of_foo_function(...); 

template&lt;typename T&gt; struct is_derived_of_foo 
{ 
    typedef decltype(is_derived_of_foo_function(static_cast&lt;T*&gt;(0))) type; 
};

template&lt;typename T, typename B = typename is_derived_of_foo&lt;T&gt;::type &gt;
struct FooBar;

template&lt;typename T&gt;
struct FooBar&lt;T, yes&gt; {
	typedef int type;
};

int main(){
	FooBar&lt;Foo&lt;int&gt; &gt;::type v1;
	FooBar&lt;Bar&lt;double&gt; &gt;::type v2;
	//FooBar&lt;int&gt;::type v3;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2137863</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2137863</guid><dc:creator><![CDATA[XSpille]]></dc:creator><pubDate>Sun, 30 Oct 2011 14:10:11 GMT</pubDate></item><item><title><![CDATA[Reply to [SOLVED] Template-Spezialisierung für alle abgeleiteten Klassen on Sun, 30 Oct 2011 16:43:50 GMT]]></title><description><![CDATA[<p>XSpille schrieb:</p>
<blockquote>
<p>Eine Frsge hab ich doch noch <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>Hat die Variante mit Hilfe von sizeof in C++0x einen Vorteil gegenüber der folgenden decltype-Version, die ich persönlich schöner finde:</p>
<pre><code class="language-cpp">typedef struct{} no; 
typedef struct{} yes;

template&lt;typename... T&gt;
struct Foo{};

template&lt;typename... T&gt;
struct Bar : public Foo&lt;T...&gt;{};

template&lt;typename... Templates&gt; yes is_derived_of_foo_function(Foo&lt;Templates...&gt; *ptr); 
no is_derived_of_foo_function(...); 

template&lt;typename T&gt; struct is_derived_of_foo 
{ 
    typedef decltype(is_derived_of_foo_function(static_cast&lt;T*&gt;(0))) type; 
};

template&lt;typename T, typename B = typename is_derived_of_foo&lt;T&gt;::type &gt;
struct FooBar;

template&lt;typename T&gt;
struct FooBar&lt;T, yes&gt; {
	typedef int type;
};

int main(){
	FooBar&lt;Foo&lt;int&gt; &gt;::type v1;
	FooBar&lt;Bar&lt;double&gt; &gt;::type v2;
	//FooBar&lt;int&gt;::type v3;
}
</code></pre>
</blockquote>
<p>Sofern du es nicht als Boolean weiterverwenden willst, wüsste ich keinen Nachteil. Allerdings bin ich etwas überrascht, dass das funktioniert, schließlich haben no und yes doch eigentlich den gleichen Typ und sollten auch nicht vom Namen her bevorzugt werden, da dieser ja noch einmal getypedef't wird.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2137927</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2137927</guid><dc:creator><![CDATA[wxSkip]]></dc:creator><pubDate>Sun, 30 Oct 2011 16:43:50 GMT</pubDate></item><item><title><![CDATA[Reply to [SOLVED] Template-Spezialisierung für alle abgeleiteten Klassen on Sun, 30 Oct 2011 16:54:40 GMT]]></title><description><![CDATA[<p>wxSkip schrieb:</p>
<blockquote>
<p>schließlich haben no und yes doch eigentlich den gleichen Typ</p>
</blockquote>
<p>Nö, das sind doch völlig unabhängige Definitionen.<br />
Aber warum typedef struct{} no; statt struct no{};?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2137929</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2137929</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Sun, 30 Oct 2011 16:54:40 GMT</pubDate></item><item><title><![CDATA[Reply to [SOLVED] Template-Spezialisierung für alle abgeleiteten Klassen on Sun, 30 Oct 2011 16:58:06 GMT]]></title><description><![CDATA[<p>volkard schrieb:</p>
<blockquote>
<p>wxSkip schrieb:</p>
<blockquote>
<p>schließlich haben no und yes doch eigentlich den gleichen Typ</p>
</blockquote>
<p>Nö, das sind doch völlig unabhängige Definitionen.<br />
Aber warum typedef struct{} no; statt struct no{};?</p>
</blockquote>
<p>Ach so, das gilt dann nur bei 2 Typedefs auf char, dass die untereinander konvertibel sind? Eigentlich ja logisch.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2137931</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2137931</guid><dc:creator><![CDATA[wxSkip]]></dc:creator><pubDate>Sun, 30 Oct 2011 16:58:06 GMT</pubDate></item><item><title><![CDATA[Reply to [SOLVED] Template-Spezialisierung für alle abgeleiteten Klassen on Sun, 30 Oct 2011 18:24:11 GMT]]></title><description><![CDATA[<p>wxSkip schrieb:</p>
<blockquote>
<p>volkard schrieb:</p>
<blockquote>
<p>wxSkip schrieb:</p>
<blockquote>
<p>schließlich haben no und yes doch eigentlich den gleichen Typ</p>
</blockquote>
<p>Nö, das sind doch völlig unabhängige Definitionen.<br />
Aber warum typedef struct{} no; statt struct no{};?</p>
</blockquote>
<p>Ach so, das gilt dann nur bei 2 Typedefs auf char, dass die untereinander konvertibel sind? Eigentlich ja logisch.</p>
</blockquote>
<p>Hier greift eine Sonderbehandlung von unbenannten Klassen in typedefs, der typedef-Name wird fürs Linken verwendet, somit sind mehrere solche Deklarationen mit unterschiedlichen Namen auch verschieden.</p>
<blockquote>
<p>7.1.3 The typedef specifier [dcl.typedef]<br />
...<br />
9 If the typedef declaration defines an unnamed class (or enum), the first typedef-name declared by the declaration to be that class type (or enum type) is used to denote the class type (or enum type) for linkage purposes only (3.5).<br />
[ Example:</p>
<p>typedef struct { } *ps, S; // S is the class name for linkage purposes</p>
<p>—end example ]</p>
</blockquote>
<p>Edit:</p>
<blockquote>
<p>9.1 Class names [<a href="http://class.name" rel="nofollow">class.name</a>]<br />
1 A class definition introduces a new type.</p>
</blockquote>
<p>ist noch einfacher. Da hier mehrere Klassendefinitionen vorliegen, definiert jede einen anderen Typ, unamhängig davon, ob es nun struct foo{} oder typedef struct {} foo heißt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2137946</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2137946</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Sun, 30 Oct 2011 18:24:11 GMT</pubDate></item><item><title><![CDATA[Reply to [SOLVED] Template-Spezialisierung für alle abgeleiteten Klassen on Sun, 30 Oct 2011 19:44:19 GMT]]></title><description><![CDATA[<p>Danke euch allen! <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f44d.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--thumbs_up"
      title=":+1:"
      alt="👍"
    /></p>
<p>volkard schrieb:</p>
<blockquote>
<p>Aber warum typedef struct{} no; statt struct no{};?</p>
</blockquote>
<p>Hast du völlig recht...<br />
Weil es aus der anderen Version entstanden ist <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>
]]></description><link>https://www.c-plusplus.net/forum/post/2137968</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2137968</guid><dc:creator><![CDATA[XSpille]]></dc:creator><pubDate>Sun, 30 Oct 2011 19:44:19 GMT</pubDate></item></channel></rss>