clang: override hides overloaded virtual member function!??

Schnelle objektorientierte, kompilierende Programmiersprache.
Antworten
Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8862
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

clang: override hides overloaded virtual member function!??

Beitrag von Xin » Sa Jun 15, 2013 5:17 pm

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?
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

nufan
Wiki-Moderator
Beiträge: 2558
Registriert: Sa Jul 05, 2008 3:21 pm

Re: clang: override hides overloaded virtual member function

Beitrag von nufan » Sa Jun 15, 2013 5:43 pm

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.

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8862
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: clang: override hides overloaded virtual member function

Beitrag von Xin » Sa Jun 15, 2013 6:16 pm

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.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Glocke
Beiträge: 332
Registriert: Fr Okt 26, 2012 8:39 am

Re: clang: override hides overloaded virtual member function

Beitrag von Glocke » Do Jun 27, 2013 8:13 am

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.

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8862
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: clang: override hides overloaded virtual member function

Beitrag von Xin » Do Jun 27, 2013 8:25 am

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.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Glocke
Beiträge: 332
Registriert: Fr Okt 26, 2012 8:39 am

Re: clang: override hides overloaded virtual member function

Beitrag von Glocke » Do Jun 27, 2013 8:31 am

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?

Antworten