559 Stimmen

Fehler: Anfrage nach Mitglied '..' in '..', das nicht vom Klassentyp ist

Ich habe eine Klasse mit zwei Konstruktoren, von denen einer keine Argumente und der andere ein Argument benötigt.

Das Erstellen von Objekten mit dem Konstruktor, der ein Argument benötigt, funktioniert wie erwartet. Wenn ich jedoch Objekte mit dem Konstruktor erstelle, der keine Argumente benötigt, erhalte ich einen Fehler.

Wenn ich zum Beispiel diesen Code kompiliere (mit g++ 4.0.1)...

class Foo
{
  public:
    Foo() {};
    Foo(int a) {};
    void bar() {};
};

int main()
{
  // this works...
  Foo foo1(1);
  foo1.bar();

  // this does not...
  Foo foo2();
  foo2.bar();

  return 0;
}

... Ich erhalte den folgenden Fehler:

nonclass.cpp: In function ‘int main(int, const char**)’:
nonclass.cpp:17: error: request for member ‘bar’ in ‘foo2’, which is of non-class type ‘Foo ()()’

Warum ist das so, und wie kann ich es schaffen?

840voto

Mykola Golubyev Punkte 54937
Foo foo2();

Wechsel zu

Foo foo2;

Sie erhalten den Fehler, weil der Compiler denkt, dass

Foo foo2()

ab der Funktionsdeklaration mit dem Namen 'foo2' und dem Rückgabetyp 'Foo'.

Aber wenn wir in diesem Fall zu Foo foo2 zeigt der Compiler möglicherweise den Fehler " call of overloaded ‘Foo()’ is ambiguous" .

42voto

ezdazuzena Punkte 5652

Nur fürs Protokoll

Es ist eigentlich keine Lösung für Ihren Code, aber ich hatte die gleiche Fehlermeldung, als ich fälschlicherweise auf die Methode einer Klasseninstanz zugriff, auf die durch myPointerToClass z.B.

MyClass* myPointerToClass = new MyClass();
myPointerToClass.aMethodOfThatClass();

wobei

myPointerToClass->aMethodOfThatClass();

wäre natürlich richtig.

16voto

Reena Cyril Punkte 377

Parenthese ist nicht erforderlich, um ein Klassenobjekt zu instanziieren, wenn Sie nicht beabsichtigen, einen parametrisierten Konstruktor zu verwenden.

Verwenden Sie einfach Foo foo2;

Es wird funktionieren.

10voto

Matt Punkte 767

Ergänzend zur Wissensbasis habe ich den gleichen Fehler für

if(class_iter->num == *int_iter)

Obwohl die IDE mir die richtigen Mitglieder für class_iter. Offensichtlich ist das Problem, dass "anything"::iterator nicht über ein Mitglied namens num also muss ich sie dereferenzieren. Das funktioniert so nicht:

if(*class_iter->num == *int_iter)

...anscheinend. Ich habe das Problem schließlich hiermit gelöst:

if((*class_iter)->num == *int_iter)

Ich hoffe, dass dies jemandem hilft, der auf diese Frage stößt, so wie ich es getan habe.

7voto

Ich hatte einen ähnlichen Fehler, es scheint, dass der Compiler den Aufruf des Konstruktors ohne Argumente missverstanden hat. Ich machte es funktionieren, indem Sie die Klammern aus der Variablen-Deklaration, in Ihrem Code etwas wie dieses:

class Foo
{
  public:
    Foo() {};
    Foo(int a) {};
    void bar() {};
};

int main()
{
  // this works...
  Foo foo1(1);
  foo1.bar();

  // this does not...
  Foo foo2; // Without "()" 
  foo2.bar();

  return 0;
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X