Объявление использования для введения зависимого имени из шаблона базового классаC++

Программы на C++. Форум разработчиков
Anonymous
 Объявление использования для введения зависимого имени из шаблона базового класса

Сообщение Anonymous »

Чтобы использовать имя из зависимого базового класса в шаблоне производного класса (например, B), необходимо добавить префикс, выделяющий компилятору, который является зависимым именем (

Код: Выделить всё

B::). А чтобы не делать этого много раз, вместо этого можно использовать объявление использования.
Ниже код с таким объявлением использования:
template 
struct A {
constexpr static int x = 0;
};

template 
struct B : A {
// ok everywhere
constexpr static int y = B::x;

// ok in MSVC
using B::x;
constexpr static int z = x;
};
обнаружено, что он отлично работает в компиляторе MSVC, хотя другим это не нравится. В частности, Clang жалуется:

ошибка: ни один элемент с именем «x» в «B»

Однако Clang не видит никаких ошибок в y = B::x на одну строку выше. Онлайн-демо: https://gcc.godbolt.org/z/PvKW753M8
Какая реализация здесь правильная и почему?

Подробнее здесь: https://stackoverflow.com/questions/790 ... s-template

Вернуться в «C++»