Ich habe eine Klasse mit zwei Konstruktoren, einer ohne Argumente und einer mit einem Argument.
Das Erstellen von Objekten mit dem Konstruktor, der ein Argument verwendet, funktioniert wie erwartet. Wenn ich jedoch Objekte mit dem Konstruktor erstelle, der keine Argumente akzeptiert, wird eine Fehlermeldung angezeigt.
Zum Beispiel, wenn ich 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 bekomme 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 bringe ich es zum Laufen?
Antworten:
ändern
Sie erhalten den Fehler, weil der Compiler daran denkt
ab Funktionsdeklaration mit dem Namen 'foo2' und dem Rückgabetyp 'Foo'.
In diesem Fall
Foo foo2
zeigt der Compiler möglicherweise den Fehler an , wenn wir zu wechseln" call of overloaded ‘Foo()’ is ambiguous"
.quelle
Nur für das Protokoll..
Es ist eigentlich keine Lösung für Ihren Code, aber ich hatte die gleiche Fehlermeldung, wenn ich falsch auf die Methode einer Klasseninstanz zugegriffen habe
myPointerToClass
, auf die zwo
wäre natürlich richtig.
quelle
Beim Hinzufügen zur Wissensdatenbank habe ich den gleichen Fehler für erhalten
Obwohl die IDE mir die richtigen Mitglieder für class_iter gegeben hat. Offensichtlich ist das Problem, dass
"anything"::iterator
kein Mitglied angerufen wird,num
also muss ich es dereferenzieren. Was so nicht funktioniert:...anscheinend. Ich habe es schließlich damit gelöst:
Ich hoffe, das hilft jemandem, der diese Frage so wie ich beantwortet.
quelle
Eine Klammer ist nicht erforderlich, um ein Klassenobjekt zu instanziieren, wenn Sie keinen parametrisierten Konstruktor verwenden möchten.
Verwenden Sie einfach Foo foo2;
Es wird klappen.
quelle
Ich hatte einen ähnlichen Fehler, es scheint, dass der Compiler den Aufruf des Konstruktors ohne Argumente falsch versteht. Ich habe es geschafft, indem ich die Klammer aus der Variablendeklaration in Ihrem Code entfernt habe:
quelle
[stmt.ambig/1]
und[dcl.ambig.res/1]
besagt der Standard ausdrücklich, dass im Falle von Mehrdeutigkeiten alles, was als Erklärung interpretiert werden kann, eine Erklärung ist, um diese Mehrdeutigkeit zu beheben.)Ich bin auf einen Fall gestoßen, in dem ich diese Fehlermeldung erhalten habe und hatte
und versuchte im Grunde, ein temporäres Bar-Objekt an den Foo-Konstruktor zu übergeben. Es stellte sich heraus, dass der Compiler dies übersetzt hat
Das heißt, eine Funktionsdeklaration mit dem Namen foo, die ein Foo zurückgibt, das ein Argument aufnimmt - einen Funktionszeiger, der einen Balken mit 0 Argumenten zurückgibt. Wenn in Provisorien wie dies vorbei, besser zu nutzen ,
Bar{}
anstattBar()
Mehrdeutigkeit zu beseitigen.quelle
Wenn Sie eine neue Substanz ohne Parameter deklarieren möchten (in dem Wissen, dass das Objekt Standardparameter hat), schreiben Sie nicht
aber
quelle
Sicherlich ein Eckfall für diesen Fehler, aber ich habe ihn in einer anderen Situation erhalten, als ich versucht habe, die Zuordnung zu überladen
operator=
. Es war ein bisschen kryptisch IMO (ab g ++ 8.1.1).Ich habe 2 "identische" Fehler erhalten
(Der entsprechende Fehler für
clang
ist:error: member reference base type 'float' is not a structure or union
)für die Zeilen
data.i = data;
unddata.f = data;
. Es stellte sich heraus, dass der Compiler den lokalen Variablennamen 'data' und meine Mitgliedsvariable verwechselt hatdata
. Als ich dies invoid operator=(T newData)
unddata.i = newData;
, ändertedata.f = newData;
, verschwand der Fehler.quelle
@ MykolaGolubyev hat bereits wunderbare Erklärungen gegeben. Ich suchte nach einer Lösung, um so etwas zu tun
MyClass obj ( MyAnotherClass() )
aber der Compiler interpretierte es als Funktionsdeklaration.C ++ 11 hat eine Klammer-Init-Liste . Damit können wir so etwas machen
Dies ist jedoch:
löst einen Kompilierungsfehler aus, der
t
vom Typ abhängtTemp(String (*)())
.quelle