Diese Frage ist eine Weiterführung der Frage, die in dieses Thema .
Verwenden Sie die folgenden Klassendefinitionen:
template <class T>
class Foo {
public:
Foo (const foo_arg_t foo_arg) : _foo_arg(foo_arg)
{
/* do something for foo */
}
T Foo_T; // either a TypeA or a TypeB - TBD
foo_arg_t _foo_arg;
};
template <class T>
class Bar : public Foo<T> {
public:
Bar (const foo_arg_t bar_arg, const a_arg_t a_arg)
: Foo<T>(bar_arg) // base-class initializer
{
Foo<T>::Foo_T = T(a_arg);
}
Bar (const foo_arg_t bar_arg, const b_arg_t b_arg)
: Foo<T>(bar_arg)
{
Foo<T>::Foo_T = T(b_arg);
}
void BarFunc ();
};
template <class T>
void Bar<T>::BarFunc () {
std::cout << _foo_arg << std::endl; // This doesn't work - compiler error is: error: ‘_foo_arg’ was not declared in this scope
std::cout << Bar<T>::_foo_arg << std::endl; // This works!
}
Wenn ich auf die Mitglieder der Basisklasse der Vorlagenklasse zugreife, scheint es, als müsste ich die Mitglieder immer explizit qualifizieren, indem ich die vorlagenartige Syntax von Bar<T>::_foo_arg
. Gibt es eine Möglichkeit, dies zu vermeiden? Kann eine "using"-Anweisung/Richtlinie in einer Methode einer Vorlagenklasse zur Vereinfachung des Codes eingesetzt werden?
Editar:
Das Problem des Geltungsbereichs wird durch die Qualifizierung der Variablen mit der Syntax this-> gelöst.