Это похоже на проблему в clang (я уже открыл ошибку для clang). ), но я хотел бы быть уверен, что я не делаю ошибку.
Рассмотрим следующий код:
struct B { };
template<typename...>
struct D;
template<typename T, typename U, typename... A>
struct D<T, U, A...>: D<U, A...> {
using C = D<U, A...>; // (1)
// using D<U, A...>::D; // (2)
// using C::C; // (3)
using C::D; // (4)
};
template<typename T>
struct D<T>: T { using T::T; };
int main() {
D<int, double, B> d{};
}
Строки (2) (если закомментировать (1) и (4)) и (3) (если закомментировать (4)) работают как положено, а (1) (пример выше как есть) дает следующие ошибки:
11 : ошибка: зависимое использование объявления разрешено для ввода без 'typename'
с использованием C::D;[...]
11 : ошибка: использование объявления ссылается на 'C::', который не является базовым классом 'D'
using C::D;
Так или иначе, C
является псевдонимом D<U, A...>
, то есть базовым классом D<T, U, A...>
.
Насколько мне известно, этот фрагмент должен компилироваться. Я ошибаюсь?
Обратите внимание, что GCC компилирует его по крайней мере с v4.8.1 до v6.1.