Следующий код компилируется не с gcc, а с Visual Studio:
template <typename T> class A {
public:
T foo;
};
template <typename T> class B: public A <T> {
public:
void bar() { cout << foo << endl; }
};
Я получаю сообщение об ошибке:
test.cpp: в функции-члене «void B :: bar ()»:
test.cpp: 11: error: «foo» не был объявлен в этой области
Но так и должно быть! Если я изменю bar
на
void bar() { cout << this->foo << endl; }
затем он компилируется, но я не думаю, что мне нужно это делать. Есть ли что-то в официальных спецификациях C ++, которым здесь следует GCC, или это просто причуда?
A<T>::foo
, 2) Используйте префиксthis->foo
, 3) Добавьте операторusing A<T>::foo
, 4) Используйте глобальный переключатель компилятора, который включает разрешающий режим. Плюсы и минусы этих решений описаны в stackoverflow.com/questions/50321788/ - person George Robinson   schedule 14.05.2018