Доступ к защищенным членам из подклассов:gcc против msvc
-
10-07-2019 - |
Вопрос
В Visual C++ я могу делать такие вещи:
template <class T>
class A{
protected:
T i;
};
template <class T>
class B : public A<T>{
T geti() {return i;}
};
Если я попытаюсь скомпилировать это в g++, я получу ошибку.Я должен сделать это:
template <class T>
class B : public A<T>{
T geti() {return A<T>::i;}
};
Разве я не должен делать первое в стандартном C++?Или что-то неправильно настроено в gcc, что выдает мне ошибки?
Решение
Раньше это было разрешено, но изменено в gcc 3.4 . р>
В определении шаблона неквалифицированные имена больше не будут находить членов зависимой базы (как указано в [temp.dep] / 3 в стандарте C ++). Например,
template <typename T> struct B {
int m;
int n;
int f ();
int g ();
};
int n;
int g ();
template <typename T> struct C : B<T> {
void h ()
{
m = 0; // error
f (); // error
n = 0; // ::n is modified
g (); // ::g is called
}
};
Вы должны сделать имена зависимыми, например, добавив им префикс this- > ;. Вот исправленное определение C :: h,
template <typename T> void C<T>::h ()
{
this->m = 0;
this->f ();
this->n = 0
this->g ();
}
Другие советы
Я понял это:
- C++ Супер часто задаваемые вопросы:«Почему я получаю ошибки, когда мой класс, производный от шаблона, использует вложенный тип, который он наследует от своего базового класса шаблона?»
- C++ Супер часто задаваемые вопросы:«Почему я получаю ошибки, когда мой класс, производный от шаблона, использует член, который он наследует от своего базового класса шаблона?»
Судя по всему, первый пример НЕ валидный C++, и плохо, что msvc его принимает.Решения опубликованы на странице часто задаваемых вопросов по C++ lite.
Возможно, вы захотите прочитать о поиске двухфазных имен р>