Code: Alles auswählen
template<typename Etype>
class FooBase
{
protected:
Etype mBar;
};
template<typename Etype>
class Foo : public FooBase<Etype>
{
public:
Etype getBar(void);
};
template<typename Etype>
Etype Foo<Etype>::getBar(void)
{
return mBar;
}
Clang hingegen schmeißt die Fehlermeldung "use of undeclared identifier mBar".
Bug im Clang oder lässt MSVC mir was durchgehen, was eigentlich nicht standardkonform ist? Und vor allem. Wie bringe ich Clang in diesem Fall bei, was ich von ihm will?
Ich könnte natürlich einen protected getter in FooBase hinzufügen, auf den Foo dann zugreift, und die Variable selbst private machen (was sicher auch in punkto Softwaredesign die bessere Wahl ist), aber das erklärt auch nicht, warum der obige Code nicht im Clang kompiliert.
EDIT: OK, könnte ich doch nicht. Foo kennt anscheinend nicht mal public Methoden von FooBase. WTF? Bin ich blind und übersehe hier etwas ganz Banales?
EDIT 2:
Folgender Code kompiliert auch im Clang:
Code: Alles auswählen
template<typename Etype>
class FooBase
{
protected:
Etype mBar;
};
template<typename Etype>
class Foo : public FooBase<Etype>
{
public:
Etype getBar(void);
};
template<typename Etype>
Etype Foo<Etype>::getBar(void)
{
return FooBase<Etype>::mBar;
}
EDIT3:
Sehe gerade, der Code mit return FooBase<Etype>::mBar kompiliert auch nur solange man das Template nirgends instanziert (logisch: mBar ist ja nicht static)
return this->mBar hingegen passt.