Доступ к защищенным членам из подклассов: gcc vs msvc - PullRequest
5 голосов
/ 11 октября 2008

В 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, что приводит к ошибкам?

Ответы [ 3 ]

6 голосов
/ 12 октября 2008

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

Возможно, вы захотите прочитать о поиске двухфазного имени

...