<?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[Nameskonflikt]]></title><description><![CDATA[<p>Folgender Code will nicht so richtig :</p>
<pre><code class="language-cpp">namespace foo{
	int bar(){}
};

class Base{
private:
	short bar;
};

class Derived:public Base{
public:
	void test(){
		using namespace foo;
		int a = bar();
	}
};
</code></pre>
<p>GCC meint dazu :</p>
<blockquote>
<p>error: <code>short int Base::bar' is private error:</code>((Base*)this)-&gt;Base::bar' cannot be used as a function</p>
</blockquote>
<p>Ist das ein Fehler im GCC oder soll das so sein?</p>
<p>Die Version ist:</p>
<blockquote>
<p>g++ (GCC) 3.4.2 (mingw-special)</p>
</blockquote>
]]></description><link>https://www.c-plusplus.net/forum/topic/147842/nameskonflikt</link><generator>RSS for Node</generator><lastBuildDate>Fri, 04 Sep 2026 14:10:03 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/147842.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 20 May 2006 15:50:29 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Nameskonflikt on Sat, 20 May 2006 15:50:29 GMT]]></title><description><![CDATA[<p>Folgender Code will nicht so richtig :</p>
<pre><code class="language-cpp">namespace foo{
	int bar(){}
};

class Base{
private:
	short bar;
};

class Derived:public Base{
public:
	void test(){
		using namespace foo;
		int a = bar();
	}
};
</code></pre>
<p>GCC meint dazu :</p>
<blockquote>
<p>error: <code>short int Base::bar' is private error:</code>((Base*)this)-&gt;Base::bar' cannot be used as a function</p>
</blockquote>
<p>Ist das ein Fehler im GCC oder soll das so sein?</p>
<p>Die Version ist:</p>
<blockquote>
<p>g++ (GCC) 3.4.2 (mingw-special)</p>
</blockquote>
]]></description><link>https://www.c-plusplus.net/forum/post/1061690</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1061690</guid><dc:creator><![CDATA[Ben04]]></dc:creator><pubDate>Sat, 20 May 2006 15:50:29 GMT</pubDate></item><item><title><![CDATA[Reply to Nameskonflikt on Sat, 20 May 2006 16:02:41 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">namespace foo{
	int bar(){}
};

class Base{
protected: //nicht private, denn private ist numal privat ;) Nur falls (1) zutrifft
	short bar;
};

class Derived:public Base{
public:
	void test(){
		using namespace foo;
		int a = bar; //(1)bar ist keine Funktion, sondern ne Variable
		//oder du willst wirklich die Funktion bar() aufrufen, dann:
		int a = foo::bar();
	}
};
</code></pre>
<blockquote>
<p>Ist das ein Fehler im GCC oder soll das so sein?</p>
</blockquote>
<p>nö, 1 oder 2 Fehler in deinem Code <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="😉"
    /></p>
<p>Edit: Der C++ Compiler nimmt immer des an, was grad im Scope ist und der Bezeichner bar aus Base überlagert aufgrund der Vererbung immer den Bezeichner bar aus dem Namespace foo.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1061692</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1061692</guid><dc:creator><![CDATA[bluecode]]></dc:creator><pubDate>Sat, 20 May 2006 16:02:41 GMT</pubDate></item><item><title><![CDATA[Reply to Nameskonflikt on Sat, 20 May 2006 17:30:22 GMT]]></title><description><![CDATA[<p>Natürlich wäre es ein Fehler wenn Base::bar protected wäre. Ist es aber nicht. Wenn ich foo::bar benutzen wollte, hätte ich den Namesraum wohl nicht gedumpt.</p>
<p>In der fraglichen Zeile ist nur foo::bar zugänglich also sehe ich nicht wieso er meckert.</p>
<p>Fals dieses Verhalten wirklich so sein sollte dann würde das bedeuten, dass man durch das verändern der privaten Teile einer Basisklasse abgeleitete Klassen brechen kann.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1061745</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1061745</guid><dc:creator><![CDATA[Ben04]]></dc:creator><pubDate>Sat, 20 May 2006 17:30:22 GMT</pubDate></item><item><title><![CDATA[Reply to Nameskonflikt on Sat, 20 May 2006 17:31:33 GMT]]></title><description><![CDATA[<p>ko, nochmal. Ich nehme an du willst die Funktion bar im namespace foo aufrufen. Da aber bereits in der Klasse derived ein Objekt namens bar deklariert ist, überdeckt dieses in jedem Fall die Funktion bar aus foo (egal wie oft du using namespace foo angibts). Nun nimmt gcc an, dass du eben das bar aus Base ansprechen willst. Deshalb kommt zum einen der Fehler, dass bar private ist (darauf kann halt ne abgelittene Klasse net zugreifen) und das bar keine Funktion ist.<br />
Wenn du nun die Funktion bar() aufrufen willst, musst du explizit den Namespace in dem sie sich befindet angeben, d.h. foo::bar() aufrufen, an Stelle von bar().</p>
<p>Der C++ Compiler kann ja von Haus aus net wissen, welchen Bezeichner du jetzt gemeint hast (bar aus Base oder bar aus foo), d.h. gibt es eben best. Regeln, welcher Bezeichner zuerst herangezogen wird. In dem Fall wird halt bar aus Base zuerst herangezogen und gcc erkennt, dass das B00lshit is ne Variable auf die Art und Weise zu verwenden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1061756</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1061756</guid><dc:creator><![CDATA[bluecode]]></dc:creator><pubDate>Sat, 20 May 2006 17:31:33 GMT</pubDate></item><item><title><![CDATA[Reply to Nameskonflikt on Sat, 20 May 2006 17:52:29 GMT]]></title><description><![CDATA[<p>bluecode schrieb:</p>
<blockquote>
<p>ko, nochmal. Ich nehme an du willst die Funktion bar im namespace foo aufrufen...</p>
</blockquote>
<p>Was da passiert weiß ich. Der GCC bringt diesbezüglich ja eine recht eindeutige Fehlermeldung. Die Frage war ob dieses Verhalten standardkonform ist.</p>
<p>bluecode schrieb:</p>
<blockquote>
<p>Der C++ Compiler kann ja von Haus aus net wissen, welchen Bezeichner du jetzt gemeint hast</p>
</blockquote>
<p>Und ob er das kann! Derived kann per Definition nicht auf die privaten Elemente von Base zugreifen. Also dürfte Base::foo gar nicht einmal in Betracht kommen.</p>
<p>Fals dieses Verhalten wirklich korrekt ist dann wechsele ich zu m_ aus technischen Gründen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1061768</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1061768</guid><dc:creator><![CDATA[Ben04]]></dc:creator><pubDate>Sat, 20 May 2006 17:52:29 GMT</pubDate></item><item><title><![CDATA[Reply to Nameskonflikt on Sat, 20 May 2006 18:04:14 GMT]]></title><description><![CDATA[<p>Ben04 schrieb:</p>
<blockquote>
<p>Fals dieses Verhalten wirklich korrekt ist dann wechsele ich zu m_ aus technischen Gründen.</p>
</blockquote>
<p>Imho ist das standardkonform, aber kA wo dein Problem damit ist <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="🙄"
    /> Ist aus dem Beispiel auch net ersichtlich...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1061777</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1061777</guid><dc:creator><![CDATA[bluecode]]></dc:creator><pubDate>Sat, 20 May 2006 18:04:14 GMT</pubDate></item><item><title><![CDATA[Reply to Nameskonflikt on Sat, 20 May 2006 18:33:03 GMT]]></title><description><![CDATA[<p>Das Problem, das ich damit habe ist, dass man eine Abgeleiteteklasse brechen kann dadurch, dass man die Implementation der Basisklasse durch eine equivalente ersetzt was die Kapselung zerstört.</p>
<pre><code class="language-cpp">void foo(){}

class A{
public:
  void set_dingsda(int new_bar){ bar = new_bar; }
private:
  int bar;
};

class B:public A{
public:
  void prob(){
    foo();
  }
};
</code></pre>
<p>So nun begint man A zu dokumentieren und stellt fest, dass es besser wäre wenn bar foo heißen würde da dies ein aussagekräftiger Name ist. bar ist nicht Teil der Schnittstelle da private, also sollte die Veränderung nur klasseninterne Auswirkungen haben.</p>
<pre><code class="language-cpp">void foo(){}

class A{
public:
  void set_dingsda(int new_foo){ foo = new_foo; }
private:
  int foo;
};

class B:public A{
public:
  void prob(){
    foo();
  }
};
</code></pre>
<p>Falsch gedacht. B wird dadurch gebrochen.</p>
<p>B kann durchaus eine Klasse ganz wo anders sein und von jemand anderem gewartet werden, der dann mal ordentlich anfängt zu fluchen, wieso jetzt auf einmal Code, der vorher einbahnfrei funktionierte, nicht mehr will.</p>
<p>Das heißt also entweder sämtliche Member pre- oder postfixen oder massiv Pimpl einsetzen um Namenskonflikte zu vermeiden. Beides nicht sonderlich elegant. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1061798</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1061798</guid><dc:creator><![CDATA[Ben04]]></dc:creator><pubDate>Sat, 20 May 2006 18:33:03 GMT</pubDate></item><item><title><![CDATA[Reply to Nameskonflikt on Sat, 20 May 2006 18:42:17 GMT]]></title><description><![CDATA[<p>Es hilft schon, den Sachen sinnvolle Namen zu geben. Dann kann ne Variable niemals so heißen wie eine Funktion.</p>
<p>Und selbst wenn: Dann macht man halt per Search &amp; Replace ne volle Qualifikation und die Sache ist gegessen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1061806</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1061806</guid><dc:creator><![CDATA[Michael E.]]></dc:creator><pubDate>Sat, 20 May 2006 18:42:17 GMT</pubDate></item><item><title><![CDATA[Reply to Nameskonflikt on Sat, 20 May 2006 19:00:55 GMT]]></title><description><![CDATA[<p>das problem sind eigentlich nicht namenskonflikte in basisklassen etc. sondern der relativ schwache bezug, den eine using direktive bewirkt. persönlich verwende ich sie eigentlich nie - wenn bezeichner aus anderen namensräumen gebraucht werden und ADL nicht genutzt wird, muss es eben ein qualifizierter bezeichner sein (evtl. mit namespace-alias verkürzt) oder ein per using deklaration sichtbarer. letztere variante hat dieses problem nicht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1061818</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1061818</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Sat, 20 May 2006 19:00:55 GMT</pubDate></item><item><title><![CDATA[Reply to Nameskonflikt on Mon, 22 May 2006 06:22:16 GMT]]></title><description><![CDATA[<p>Ben04 schrieb:</p>
<blockquote>
<p>bluecode schrieb:</p>
<blockquote>
<p>Der C++ Compiler kann ja von Haus aus net wissen, welchen Bezeichner du jetzt gemeint hast</p>
</blockquote>
<p>Und ob er das kann! Derived kann per Definition nicht auf die privaten Elemente von Base zugreifen. Also dürfte Base::foo gar nicht einmal in Betracht kommen.</p>
<p>Fals dieses Verhalten wirklich korrekt ist dann wechsele ich zu m_ aus technischen Gründen.</p>
</blockquote>
<p>Das Problem bei dieser Begründung ist aber, daß Sichtbarkeit (welche Namen sind verfügbar?) und Schutzbedingungen (auf welche Elemente darf ich zugreifen?) unabhängig voneinander geprüft werden - zuerst wird festgestellt, welche Objekte sichtbar sind, danach werden die Zugriffsrechte auf diese Objekte kontrolliert.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1062479</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1062479</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Mon, 22 May 2006 06:22:16 GMT</pubDate></item><item><title><![CDATA[Reply to Nameskonflikt on Tue, 23 May 2006 08:51:11 GMT]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>vielleicht wirds klarer, wenn man sich mal bewusst wird, was Vererbung eigentlich bedeutet. Alles von der Basisklasse wird weitervererbt. Auch die privaten Elemente. Diese sind zwar nicht sichtbar, aber trotzdem <strong>in der Kindklasse</strong> vorhanden.</p>
<p>Es ist also quasi <strong>EIN</strong> Objekt, auch wenn Vererbung und zwei Klassen im Spiel sind.</p>
<p>Daher versucht der Compiler immer zuerst auf die eigenen Variablen zuzugreifen. Das ist aber eine private Methode, und daher kann er nicht darauf zugreifen.</p>
<p>Dasist kein Verstoß gegen OO, sondern ein OO-Designfehler.</p>
<p>Ich weiß nicht ob es die Möglichkeit in C++ gibt, aber z.B. in Java oder auch in C# ist es möglich mit dem Schlüsselwort &quot;new&quot; neue Methoden/Variablen einzuführen, und die &quot;alten&quot; zu vergessen. Aber auch das ist nicht die &quot;feine Art&quot;.</p>
<p>Gruß<br />
Norman-Timo</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1063309</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1063309</guid><dc:creator><![CDATA[norman_timo]]></dc:creator><pubDate>Tue, 23 May 2006 08:51:11 GMT</pubDate></item></channel></rss>