2017-05-29 3 views
0

Ich portiere älteren Code aus MS Visual Studio nach Clang und stoße auf ein Problem mit geschützten Datenelementen. Kurz gesagt, mein Problem ist das:clang erkennt keine geschützten Datenelemente

template<typename T> 
class Base : public SuperBase<T> { 
public: 
    Base(std::shared_ptr<Widget<T>> const& sb) : sb_(sb) {} 

protected: 
    std::shared_ptr<Widget<T>> sb_; 
} 

template <typename T> 
class Derived : public Base<T> 
{ 
public: 
    Derived(std::shared_ptr<Widget<T>> const& sb) : Base<T>(sb) {} 

    double method(void) const { return sb_->number(); } 
} 

Dies kompiliert gut unter MSVC++, aber nicht unter Clang. Clang beschwert sich:

Verwendung von undeclared Identifikator sb_.

Nach Meyers Wirksam C++ Ich benutze nicht geschützt viel und kann den Code neu schreiben, nicht zu verwenden, aber ich wundere mich immer noch, warum Clang hier beschwert, wie die abgeleitete Klasse in der Lage sein sollte, die geschützten Mitglieder der Base-Klasse zu sehen . Was vermisse ich?

+1

Können Sie bitte die gesamte Fehlermeldung, oder zumindest einen Teil davon abgeben? Ich vermute, dass das eigentliche Problem ist, dass "sb_" keine Funktion namens "Nummer" hat. – Rakete1111

+1

Shoud nicht 'sb _-> Nummer();'? – Amadeus

+1

MCVE ...........? –

Antwort

2
+0

IMHO, wenn du weißt, dass dies ein Betrogener ist, solltest du ihn lieber als Antwort markieren (als Antwort). – Walter

+0

Ich stimme zu, aber leider habe ich keine Rechte, Fragen als Duplikate zu schließen. – Kane

+0

Danke. Wenn die Basisklasse templatisiert wird, sollte dies explizit verwendet werden. – Mike

0

unique_ptr s sind nicht kopierbar, Sie versuchen, sie in den Konstruktor Base zu kopieren, die der erste Fehler, den Sie versuchen sollten und beheben, alles danach nur automatisch behoben könnte, wenn man sich den ersten Fehler suchen Sie bekommen und in dem Klirren Ausgang beheben, dass

Weitere wie in den Kommentaren darauf hingewiesen, sb_ ein Zeiger ist und keine Referenz, sollten Sie den -> Operator auf sie verwenden und nicht . so ändern sb_->number()-sb_->number()