Использование переменных-членов, унаследованных от шаблонного базового класса (C ++) - PullRequest
6 голосов
/ 29 апреля 2010

Я пытаюсь использовать переменные-члены шаблонного базового класса в производном классе, как в этом примере:

template <class dtype>
struct A {
    int x;
};

template <class dtype>
struct B : public A<dtype> {
    void test() {
        int id1 = this->x;      // always works
        int id2 = A<dtype>::x;  // always works
        int id3 = B::x;         // always works
        int id4 = x;            // fails in gcc & clang, works in icc and xlc
    }
};

gcc и clang очень требовательны к использованию этой переменной и требуют либо явной области действия, либо явного использования «this». С некоторыми другими компиляторами (xlc и icc) все работает так, как я ожидал. Это случай, когда xlc и icc разрешают нестандартный код, или это ошибка в gcc и clang?

1 Ответ

5 голосов
/ 29 апреля 2010

Вы, вероятно, компилируете в нестрогом режиме в icc. В любом случае, поскольку x является неквалифицированным, его нельзя искать ни в каких базовых классах, которые зависят от параметров шаблона. Таким образом, в вашем коде нет места, где x найден, и ваш код недействителен.

Другие имена ищутся с использованием другой формы поиска (поиск доступа к членам класса и квалифицированный поиск). Обе эти формы будут искать зависимые базовые классы, если они могут (то есть, если они являются зависимыми, и, таким образом, ищутся при создании экземпляра шаблона, когда известен dtype - все остальные ваши имена зависят от параметров шаблона).

Даже GCC в своих последних версиях не реализует это правильно, и некоторые зависимые имена по-прежнему сопоставляются с зависимыми базами во время неквалифицированного поиска.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...