c++: keine passende Funktion für Aufruf, aber der Kandidat hat exakt die gleiche Signatur

g++ beschwert sich über

myclass.cxx:185: error: no matching function for call to 'IMyInterface::doSomething(const SomeClass*, unsigned int)'
IMyInterface.h:34: note: candidates are: virtual void IMyInterface::doSomething(const SomeClass*&, unsigned int)

wenn ich Anrufe,

m_instanceOfInterface->doSomething((const SomeClass*)0,(unsigned int)1);

Alle Zeiger auf warum? Es scheint mir, dass g++ ist zu sehen, dass genau die gleiche Signatur zwischen dem, was erklärt wird und was aufgerufen wird, aber trotzdem beschwert sich darüber, keine passende Funktion gefunden.

Kann ich nennen, im gleichen Zusammenhang, eine andere Funktion des IMyInteface, IMyInterface::doSomethingElse(float& p). Also irgendwie die const ist das problem?


Habe ich nicht übergeben den NULL-Zeiger und warf eine Konstante ganze Zahl, nur so zum Spaß... ursprünglich habe ich

m_instanceOfInterface->doSomething((const SomeClass*)m_someDerivedClass,m_anInteger);

und bekam den gleichen Fehler. Also habe ich beschlossen, zu klären, Dinge, die mit g++, indem einige explizite Argumente. Ich kann Ihnen versichern, dass der NULL-Zeiger ist NICHT das problem - obwohl verständlich, wir alle duckte sich ein wenig, wenn man eine NULL übergeben wird mit const 🙂

  • Funktioniert es, wenn Sie den Mauszeiger vor dem Aufruf der Funktion? Ich meine const SomeClass* ptr = 0; und dann m_instance->doSomething (ptr, 1)
  • PS: bitte fügen Sie den funktionskopf (Deklaration in der header), könnte das helfen...
  • Das (d.h. die Schaffung Zeiger vor dem Aufruf) das problem gelöst! Aber warum g++ geben, wie kryptische Nachricht?
  • Es ist ein syntax Fehler, du hast vergessen eine Klammer. Auch, warum warf einen integer? Sie können nur sagen 1U.
  • SB: Oder nur 1 Punkt. Der compiler ist intelligent genug, um zu wissen, wie man werfe einen positiven int zu einem unsigned int.
  • template <typename T> foo(T, T); unsigned int bar(); foo(bar(), 1); 🙁
  • Die Fehlermeldung macht es so Aussehen, als wenn es nur einen Kandidaten, wobei unsigned int. Aber es ist zumindest möglich, dass die Fehlermeldung abgeschnitten wurde, nur um zu zeigen die Kandidaten, dass der Fragesteller denkt, sollten aufeinander abgestimmt werden, und es gibt auch eine int überlastung. Oder werden in Zukunft. Nicht, dass Sie oft sorgen über solche Dinge, aber es wäre falsch zu vermuten, dass 1 wird es immer tun.
  • Sie können auch dieses Problem beheben, indem die Deklaration der Funktion wie doSomething(const SomeClass *const &, unsigned int). Auch müssen Sie nicht die const beim ausspielen von 0 bis SomeClass * (obwohl es nicht schadet)

InformationsquelleAutor polyglot | 2011-08-31
Schreibe einen Kommentar