Подтвердить что ты не робот

Скрытие параметра шаблона шаблона члена

из temp.local:

В определении члена шаблона класса, который появляется за пределами определения шаблона класса, имя члена класса template скрывает имя шаблона-параметра любого входящего класса шаблоны (, но не шаблонный параметр члена, если член шаблон класса или функции). [Пример:

template<class T> struct A {
  struct B { /* ... */ };
  typedef void C;
  void f();
  template<class U> void g(U);
};

template<class B> void A<B>::f() {
  B b;              // A B, not the template parameter
}

template<class B> template<class C> void A<B>::g(C) {
  B b;              // A B, not the template parameter
  C c;              // the template parameter C, not A C
}

- конец примера]

проблема заключается в том, что каждый компилятор, который я пробовал (g++, vc, icc, clang), рассматривает C в A<B>::g(C) как имя члена A и не компилирует этот пример.

Это обычная ошибка.?

4b9b3361

Ответ 1

Пока ссылка, которую вы указали, выглядит черновиком и явно заявляет, что она не является частью какого-либо стандарта (http://eel.is/c++draft/) этот конкретный пункт в проекте, как представляется, идентичен стандарту ISO С++ 14.6.1, п. 7.

Таким образом, это действительно является либо общей ошибкой компилятора, либо оговоркой, которая конфликтует с другими статьями и проиграна. Я проверил, что пример не компилируется на MacOS Clang v802.0.42). Поскольку вы говорите, что все основные компиляторы испускают ошибки здесь, я бы предположил, что этот раздел нецелесообразно реализовать из-за конфликтов с некоторыми другими предложениями.

EDIT: я также нашел обсуждение в рамках сообщества стандартов здесь, относящееся к этой теме. Глубина, с которой она обсуждается здесь предлагает мне, чтобы это правило было спорным и даже могло быть изменено.