Доступ к защищенным членам из подклассов: gcc vs msvc

В 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?

dmckee --- ex-moderator kitten 11.10.2008 23:48

обман: stackoverflow.com/questions/11405/template-problem-with-gcc

Jesse Beder 13.10.2008 04:21
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
5
2
1 521
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Раньше это было разрешено, но изменилось в 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 ();
    }

Хех ... Вы, должно быть, писали одновременно со мной. Странно, что msvc принимает это, даже если он недействителен (и вызывал странные ошибки времени выполнения).

Jason Baker 12.10.2008 01:08

Да, я увидел ваш пост сразу после того, как нашел примечания к выпуску. Я думаю, что, вероятно, старые версии как gcc, так и vC++ поддерживали неправильный способ. Но gcc решил сделать это правильно, а vC++ решил сохранить обратную совместимость.

Brian R. Bondy 12.10.2008 01:26

Вы можете прочитать о двухэтапный поиск имени

Другие вопросы по теме