Seite 1 von 1

clang: override hides overloaded virtual member function!??

Verfasst: Sa Jun 15, 2013 5:17 pm
von Xin
Vielleicht kann mir ja jemand erklären, wie das hier funktioniert.

Ich habe eine Klasse BaseElement, die eine virtuelle Methode "RequestValue" besitzt. Davon leite ich eine Klasse ValueType ab. ValueType kümmert sich nicht nicht um RequestValue. Von ValueType leite ich die Klasse String ab und überschreibe RequestValue.
Dabei erhalte ich folgende Meldungen:

Code: Alles auswählen

clang++ | viewdoc (de/xsd/doc).....
In file included from ../../../de/xsd/doc/viewdoc.cpp:41:
../../../de/xsd/block/element/string.h:52:19: error: 'RequestValue' marked 'override' but does not override any member functions
    virtual Value RequestValue( OutputConnector & out, ValueRequest & rv ) override;
                  ^
../../../de/xsd/block/element/string.h:52:19: warning: 'XSD::Block::Element::String::RequestValue' hides overloaded virtual function [-Woverloaded-virtual]
../../../de/xsd/block/element.h:393:19: note: hidden overloaded virtual function 'XSD::Block::BaseElement::RequestValue' declared here
    virtual Value RequestValue( OutputConnector & out, ValueRequest & valueRequest );      ///< Creates an answer
                  ^
Lasse ich das Override weg, verstecke ich nur noch noch eine virtual member function.

Hier nochmal beide Signaturen, oben die aus BaseElement, ValueType deklariert keine, unten die aus String

Code: Alles auswählen

    virtual Value RequestValue( OutputConnector & out, ValueRequest & valueRequest );      ///< Creates an answer
    virtual Value RequestValue( OutputConnector & out, ValueRequest & rv ) override;
Hat jemand eine Idee, was clang von mir hören möchte?

Re: clang: override hides overloaded virtual member function

Verfasst: Sa Jun 15, 2013 5:43 pm
von nufan
Ohne Code schwer zu sagen. Ich hab versucht das nachzubauen:

Code: Alles auswählen

#include <iostream>

class BaseElement
{
  public:
    virtual int requestValue() { return 0; }
};

class ValueType : public BaseElement
{
};

class String : public ValueType
{
  public:
    virtual int requestValue() override { return 1; }
};

int main()
{
  std::cout << String().requestValue() << std::endl;
  return 0;
}
Sowohl g++ als auch clang++ kompilieren mit -Wall ohne irgendeine Meldung und geben 1 aus.

Re: clang: override hides overloaded virtual member function

Verfasst: Sa Jun 15, 2013 6:16 pm
von Xin
dani93 hat geschrieben:Ohne Code schwer zu sagen.
Auch mit Code ist das nicht wirklich einfacher. Das sind zwei Tonnen Code, die Klassen sind also sehr groß. Aber das Problem hast Du schon richtig wiedergegeben.

Mehr habe ich auch nicht - nur die Fehlermeldungen.

Re: clang: override hides overloaded virtual member function

Verfasst: Do Jun 27, 2013 8:13 am
von Glocke
Versuch mal das Problem auf so ein kleines Codebeispiel runterzubrechen, so dass dein Problem da reproduziert wird. Aus deiner Fehlermeldung lese ich, dass die Methode (mit der du überschreibst) keiner Klasse zugeordnet ist - eigentlich sollte da (wie unten) Namespace und zugehörige Klasse mit auftauchen. Allerdings habe ich bisher auch nicht wirklich mit clang gearbeitet.

Re: clang: override hides overloaded virtual member function

Verfasst: Do Jun 27, 2013 8:25 am
von Xin
Das mit dem Rückgabewert schnell wieder rausgelöscht, hm? ;-)
Glocke hat geschrieben:Versuch mal das Problem auf so ein kleines Codebeispiel runterzubrechen, so dass dein Problem da reproduziert wird.
Kann ich nicht. Das Ding ist ein großer Klotz, eine visuelle Programmiersprache und die Funktion wird halt in jeder Operation überladen.

Das hat leider zum Ergebnis, dass ich da nicht mal eben alles auskommentieren kann. dani93s Beispiel spiegelt die Situation eigentlich korrekt wider.

Die Fehlermeldung an sich ist ja auch irrsinnig. Einerseits überlade ich keine Funktion, andererseits verstecke ich eine. Das wäre der Fall, wenn die Funktionen eine unterschiedliche Signatur hätten. Den Unterschied sehe ich aber nicht.

Re: clang: override hides overloaded virtual member function

Verfasst: Do Jun 27, 2013 8:31 am
von Glocke
Xin hat geschrieben:Das mit dem Rückgabewert schnell wieder rausgelöscht, hm? ;-)
Naja der Marker stand auf dem Return Value .. das hat mich verwirrt :D
Xin hat geschrieben:Kann ich nicht. Das Ding ist ein großer Klotz, eine visuelle Programmiersprache und die Funktion wird halt in jeder Operation überladen.
Ich befürchte ohne konkretes Beispiel wird uns nur Raten übrigbleiben ;)
Xin hat geschrieben:Die Fehlermeldung an sich ist ja auch irrsinnig. Einerseits überlade ich keine Funktion, andererseits verstecke ich eine. Das wäre der Fall, wenn die Funktionen eine unterschiedliche Signatur hätten. Den Unterschied sehe ich aber nicht.
Prinzipiell könnte das auch ein Fehler in deiner clang-Version sein - dass er die Sache falsch interpretiert. Welche Version verwendest du?