<?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[Sichtbarkeit in abgeleiteten Klassen]]></title><description><![CDATA[<p>Hallo.</p>
<p>Kann mir jemand bitte erklären, wieso das folgende so ist, wie es ist? (<a href="http://ideone.com/Ulem0J" rel="nofollow">Geht nicht</a>, <a href="http://ideone.com/6Phvw1" rel="nofollow">geht</a>)</p>
<pre><code>template&lt;bool Condition, typename T = void&gt;
struct EnableIf
{
};
template&lt;typename T&gt;
struct EnableIf&lt;true, T&gt;
{
	typedef T Type;
};

struct Base
{
	static const int Foo = 0;
};

template&lt;int KeySize&gt;
struct Derived : public EnableIf&lt;true || KeySize == 42, Base&gt;::Type // Geht nicht
// struct Derived : public EnableIf&lt;true, Base&gt;::Type // Geht
{
	static const int Bar = Foo;
};

int main()
{
	Derived&lt;42&gt; Inst;
}
</code></pre>
<p><code>(true)</code> und <code>(true || KeySize == 42)</code> sollten doch stets beide in <code>true</code> resultieren und daher das selbe Verhalten aufweisen. Aber sowohl GCC als auch MSVC streiken bei der Version mit der zusätzlichen Gleichheitsprüfung.</p>
<p>MSVC 2013:</p>
<pre><code>error C2065: 'Foo': nichtdeklarierter Bezeichner
</code></pre>
<p>GCC 4.8.1:</p>
<pre><code>error: 'Foo' was not declared in this scope
</code></pre>
<p>Zunächst dachte ich an einen Compilerbug, dass aber gleich beide Compiler aussteigen liess mich wundern...</p>
<p>PS.: Alternativen zum gezeigten Code fallen mir schon selbst ein, ich wüsste nur gerne wie das Verhalten zustande kommt.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/329072/sichtbarkeit-in-abgeleiteten-klassen</link><generator>RSS for Node</generator><lastBuildDate>Tue, 07 Jul 2026 02:31:11 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/329072.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 06 Nov 2014 17:31:43 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Sichtbarkeit in abgeleiteten Klassen on Thu, 06 Nov 2014 17:31:43 GMT]]></title><description><![CDATA[<p>Hallo.</p>
<p>Kann mir jemand bitte erklären, wieso das folgende so ist, wie es ist? (<a href="http://ideone.com/Ulem0J" rel="nofollow">Geht nicht</a>, <a href="http://ideone.com/6Phvw1" rel="nofollow">geht</a>)</p>
<pre><code>template&lt;bool Condition, typename T = void&gt;
struct EnableIf
{
};
template&lt;typename T&gt;
struct EnableIf&lt;true, T&gt;
{
	typedef T Type;
};

struct Base
{
	static const int Foo = 0;
};

template&lt;int KeySize&gt;
struct Derived : public EnableIf&lt;true || KeySize == 42, Base&gt;::Type // Geht nicht
// struct Derived : public EnableIf&lt;true, Base&gt;::Type // Geht
{
	static const int Bar = Foo;
};

int main()
{
	Derived&lt;42&gt; Inst;
}
</code></pre>
<p><code>(true)</code> und <code>(true || KeySize == 42)</code> sollten doch stets beide in <code>true</code> resultieren und daher das selbe Verhalten aufweisen. Aber sowohl GCC als auch MSVC streiken bei der Version mit der zusätzlichen Gleichheitsprüfung.</p>
<p>MSVC 2013:</p>
<pre><code>error C2065: 'Foo': nichtdeklarierter Bezeichner
</code></pre>
<p>GCC 4.8.1:</p>
<pre><code>error: 'Foo' was not declared in this scope
</code></pre>
<p>Zunächst dachte ich an einen Compilerbug, dass aber gleich beide Compiler aussteigen liess mich wundern...</p>
<p>PS.: Alternativen zum gezeigten Code fallen mir schon selbst ein, ich wüsste nur gerne wie das Verhalten zustande kommt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2426210</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2426210</guid><dc:creator><![CDATA[Fytch]]></dc:creator><pubDate>Thu, 06 Nov 2014 17:31:43 GMT</pubDate></item><item><title><![CDATA[Reply to Sichtbarkeit in abgeleiteten Klassen on Thu, 06 Nov 2014 19:28:59 GMT]]></title><description><![CDATA[<blockquote>
<p>Aber sowohl GCC als auch MSVC streiken bei der Version mit der zusätzlichen Gleichheitsprüfung.</p>
</blockquote>
<p>Ja, weil die Basisklasse dann eben von einem Template-Argument abhängig ist. Ob das evaluiert wird ist irrelevant.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2426245</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2426245</guid><dc:creator><![CDATA[Columbo]]></dc:creator><pubDate>Thu, 06 Nov 2014 19:28:59 GMT</pubDate></item><item><title><![CDATA[Reply to Sichtbarkeit in abgeleiteten Klassen on Thu, 06 Nov 2014 20:59:10 GMT]]></title><description><![CDATA[<p>Arcoth schrieb:</p>
<blockquote>
<blockquote>
<p>Aber sowohl GCC als auch MSVC streiken bei der Version mit der zusätzlichen Gleichheitsprüfung.</p>
</blockquote>
<p>Ja, weil die Basisklasse dann eben von einem Template-Argument abhängig ist. Ob das evaluiert wird ist irrelevant.</p>
</blockquote>
<p>Das bedeutet, du musst da explizit ein Base:: vorpacken.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2426271</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2426271</guid><dc:creator><![CDATA[Nathan]]></dc:creator><pubDate>Thu, 06 Nov 2014 20:59:10 GMT</pubDate></item><item><title><![CDATA[Reply to Sichtbarkeit in abgeleiteten Klassen on Fri, 07 Nov 2014 07:33:30 GMT]]></title><description><![CDATA[<p>Von dieser Regel wusste ich gar nicht, aber sie ergibt natürlich Sinn. Danke euch beiden, die Sache ist geklärt.</p>
<p>PS.: Interessant ist, dass <code>this-&gt;</code> (das dachte ich mir schon, denn deswegen wurde ich auch noch nie mit der Problematik konfrontiert) oder <code>Derived::</code> auch den Trick machen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2426313</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2426313</guid><dc:creator><![CDATA[Fytch]]></dc:creator><pubDate>Fri, 07 Nov 2014 07:33:30 GMT</pubDate></item></channel></rss>