<?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[Problem bei gleichem Methodenname wie Klassenname]]></title><description><![CDATA[<p>Hallöchen</p>
<p>Ich bin gerade dabei C++ code geschrieben/compiliert mit MS Visual Studio 2005 auf Linux / gcc 4.2 zu portieren. Dabei bin ich auf folgendes Problem gestossen (Namen hab ich der Einfachheit halber geändert):</p>
<p>In einem Header-file wird ein Interface definiert:</p>
<pre><code class="language-cpp">namespace x
{
class A;

class B
{
  public:

    virtual A* A() = 0;
};
}
</code></pre>
<p>Die Klasse A wird vorwärts deklariert damit der Rückgabewert der <strong>Methode</strong> A bekannt ist. gcc meldet folgende Fehlermeldung:<br />
<em>&quot;declaration of virtual 'x::A</em> x::B::A()' changes meaning of 'A' from 'struct x::A'&quot;*</p>
<p>Irgendwie scheint gcc nicht zu merken, dass &quot;A()&quot; eine Methodendeklaration ist und nichts mit der Klasse A zu tun hat... Ich hab aber keine Ahnung wie ich den Fehler beheben kann...</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/256186/problem-bei-gleichem-methodenname-wie-klassenname</link><generator>RSS for Node</generator><lastBuildDate>Fri, 11 Sep 2026 10:43:07 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/256186.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 09 Dec 2009 12:27:34 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Problem bei gleichem Methodenname wie Klassenname on Wed, 09 Dec 2009 12:27:34 GMT]]></title><description><![CDATA[<p>Hallöchen</p>
<p>Ich bin gerade dabei C++ code geschrieben/compiliert mit MS Visual Studio 2005 auf Linux / gcc 4.2 zu portieren. Dabei bin ich auf folgendes Problem gestossen (Namen hab ich der Einfachheit halber geändert):</p>
<p>In einem Header-file wird ein Interface definiert:</p>
<pre><code class="language-cpp">namespace x
{
class A;

class B
{
  public:

    virtual A* A() = 0;
};
}
</code></pre>
<p>Die Klasse A wird vorwärts deklariert damit der Rückgabewert der <strong>Methode</strong> A bekannt ist. gcc meldet folgende Fehlermeldung:<br />
<em>&quot;declaration of virtual 'x::A</em> x::B::A()' changes meaning of 'A' from 'struct x::A'&quot;*</p>
<p>Irgendwie scheint gcc nicht zu merken, dass &quot;A()&quot; eine Methodendeklaration ist und nichts mit der Klasse A zu tun hat... Ich hab aber keine Ahnung wie ich den Fehler beheben kann...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1820052</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1820052</guid><dc:creator><![CDATA[tlrs_ing]]></dc:creator><pubDate>Wed, 09 Dec 2009 12:27:34 GMT</pubDate></item><item><title><![CDATA[Reply to Problem bei gleichem Methodenname wie Klassenname on Wed, 09 Dec 2009 13:16:50 GMT]]></title><description><![CDATA[<p>tlrs_ing schrieb:</p>
<blockquote>
<p>Ich hab aber keine Ahnung wie ich den Fehler beheben kann...</p>
</blockquote>
<p>Ganz einfach: Indem du die Methode anders nennst. A() ist bereits der Konstruktor der Klasse A. nenn die Methode GetA() oder MakeA() - was eben angebracht ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1820075</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1820075</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Wed, 09 Dec 2009 13:16:50 GMT</pubDate></item><item><title><![CDATA[Reply to Problem bei gleichem Methodenname wie Klassenname on Wed, 09 Dec 2009 13:31:39 GMT]]></title><description><![CDATA[<p>Das hab ich vergessen zu erwähnen. Ich möchte, wenn möglich, die Methode A() <strong>nicht</strong> umbenennen. Ist mir schon klar, dass das eine Variante wär. Aber wie gesagt, das ganze ist eine Portierung und sollte so wenig verändern wie möglich.</p>
<p>Zudem ist mir wie gesagt nicht ganz klar warum er die Methode A() mit dem Konstruktor der Klasse A verwechselt. Der &quot;full qualified namespace&quot; der Methode ist ja x::B::A() und der vom Konstruktor ist ja x::A::A(). Zudem hätt ich erwartet, dass gcc merkt, dass die betreffende Zeile eine Methodendeklaration ist und kleine Klasseninstanziierung oder sonst was...</p>
<p>Aber eben, ich weiss nicht genau ob gcc ein Fehler macht oder ob's einfach nicht ANSI C entspricht oder ob man gcc sonst irgendwie auf die Sprünge helfen könnte...<br />
Bin für weitere Ratschläge dankbar! <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>
]]></description><link>https://www.c-plusplus.net/forum/post/1820085</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1820085</guid><dc:creator><![CDATA[tlrs_ing]]></dc:creator><pubDate>Wed, 09 Dec 2009 13:31:39 GMT</pubDate></item><item><title><![CDATA[Reply to Problem bei gleichem Methodenname wie Klassenname on Wed, 09 Dec 2009 13:45:37 GMT]]></title><description><![CDATA[<p>Ansi C entsprichts nicht.. wenn schon Ansi C++... <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f576.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--sunglasses"
      title=":sunglasses:"
      alt="🕶"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1820092</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1820092</guid><dc:creator><![CDATA[theta]]></dc:creator><pubDate>Wed, 09 Dec 2009 13:45:37 GMT</pubDate></item><item><title><![CDATA[Reply to Problem bei gleichem Methodenname wie Klassenname on Thu, 10 Dec 2009 00:22:47 GMT]]></title><description><![CDATA[<p>Vielleicht stört sich GCC nur daran dass du &quot;A&quot; innerhalb einer Deklaration einmal als &quot;x::A&quot; verwendest, und gleichzeitig &quot;A&quot; als &quot;x::B::A&quot; deklarierst.<br />
Ob sowas laut Standard erlaubt ist weiss ich nicht, aber ich finde es eigentlich ganz gut, dass es GCC nicht &quot;durchgehen&quot; lässt. Ist ja auch ziemlich ... grauslich.</p>
<p>Schuss ins Blaue: versuch mal einen Typedef zu machen:</p>
<pre><code class="language-cpp">namespace x
{
class A;

class B
{
public:

    typedef A x_A;

    virtual x_A* A() = 0;
};
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1820382</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1820382</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Thu, 10 Dec 2009 00:22:47 GMT</pubDate></item><item><title><![CDATA[Reply to Problem bei gleichem Methodenname wie Klassenname on Thu, 10 Dec 2009 07:06:32 GMT]]></title><description><![CDATA[<p>Hab mal versucht, das unter MSVC zu machen, der schluckts. Was natürlich bei weitem keine Garantie ist dass der Standard es erlaubt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1820408</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1820408</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Thu, 10 Dec 2009 07:06:32 GMT</pubDate></item><item><title><![CDATA[Reply to Problem bei gleichem Methodenname wie Klassenname on Thu, 10 Dec 2009 07:11:11 GMT]]></title><description><![CDATA[<p>Das ist genau mein Problem <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>Wie eingangs erwähnt stammt der Originalcode von Visual Studio 2005. Und dort gehts problemlos. Wobei sich Visual Studio bei weitem weniger streng an die ANSI Normen hält als der gcc.<br />
Aber der gcc ist ja auch nicht perfekt... <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="😉"
    /><br />
Ich werd den Ansatz mit dem typedef mal probieren. Und vielleicht würde ja ein include des Header files der Klasse A (anstatt der Vorwärtsdeklaration) helfen...</p>
<p>Und ja, wenn das &quot;mein&quot; code wär, würde die Methode schon lange &quot;getA()&quot; heissen... <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>
]]></description><link>https://www.c-plusplus.net/forum/post/1820412</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1820412</guid><dc:creator><![CDATA[tlrs_ing]]></dc:creator><pubDate>Thu, 10 Dec 2009 07:11:11 GMT</pubDate></item><item><title><![CDATA[Reply to Problem bei gleichem Methodenname wie Klassenname on Thu, 10 Dec 2009 08:18:40 GMT]]></title><description><![CDATA[<blockquote>
<p>Wobei sich Visual Studio bei weitem weniger streng an die ANSI Normen hält als der gcc.</p>
</blockquote>
<p>Das stelle ich mal in Frage bei den neueren MSVC Compilern.<br />
Simon</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1820428</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1820428</guid><dc:creator><![CDATA[theta]]></dc:creator><pubDate>Thu, 10 Dec 2009 08:18:40 GMT</pubDate></item><item><title><![CDATA[Reply to Problem bei gleichem Methodenname wie Klassenname on Thu, 10 Dec 2009 14:37:31 GMT]]></title><description><![CDATA[<p>so, konnte das problem lösen.</p>
<p>hab dir function mit</p>
<pre><code class="language-cpp">virtual x::A* A() = 0;
</code></pre>
<p>deklariert. Dann frisst gcc das... <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>Welche version jetzt mehr ANSI entspricht (mit oder ohne namespace angabe) dürft ihr selber nachschauen <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>Ich musste einfach feststellen, dass visual studio ein paar mühsame eigenschaften hat... z.b. kompiliert der auch wenn man die standart lib header dateien nicht inkludiert (visual studio findet die sonst irgnedwie). Ist zwar praktisch für den entwickler, aber für portierungen doof <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/1820664</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1820664</guid><dc:creator><![CDATA[tlrs_ing]]></dc:creator><pubDate>Thu, 10 Dec 2009 14:37:31 GMT</pubDate></item><item><title><![CDATA[Reply to Problem bei gleichem Methodenname wie Klassenname on Thu, 10 Dec 2009 14:58:48 GMT]]></title><description><![CDATA[<p>hustbaer schrieb:</p>
<blockquote>
<p>Schuss ins Blaue: versuch mal einen Typedef zu machen:</p>
<pre><code class="language-cpp">namespace x
{
class A;

class B
{
public:

    typedef A x_A;

    virtual x_A* A() = 0;
};
}
</code></pre>
</blockquote>
<p>Das hilft nicht. Im Allgemeinen kann ein Bezeichner außerhalb der Klasse, der durch einen gleichnamigen Bezeichner innerhalb der Klasse verdeckt wird, nicht unqualifiziert innerhalb der Klassendefinition oder der Definitionen/Deklaartionen seiner Member verwendet werden. Ausnahme wäre ggf. ein typedef, dass mit dem gleichen Namen auf den äußeren Bezeichner abbildet.</p>
<p>3.3.6/2 schrieb:</p>
<blockquote>
<ol start="2">
<li>A name N used in a class S shall refer to the same declaration in its context and when re-evaluated in the completed scope of S. No diagnostic is required for a violation of this rule.</li>
</ol>
</blockquote>
]]></description><link>https://www.c-plusplus.net/forum/post/1820686</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1820686</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Thu, 10 Dec 2009 14:58:48 GMT</pubDate></item></channel></rss>