Ошибка gcc expected nested-name-specifier при наследовании конструкторов
Вот на такой код
template<typename>
struct B {
};
template<typename... Types>
struct A : public B<Types>... {
using B<Types>::B...;
using B<Types>::operator=...;
};
компилятор gcc ругается:
error: expected nested-name-specifier before 'B'
8 | using B<Types>::operator=...;
| ^
а при перестановке местами using
template<typename>
struct B {
};
template<typename... Types>
struct A : public B<Types>... {
using B<Types>::operator=...;
using B<Types>::B...;
};
все нормально
При этом clang-у и так и так хорошо. Никак не пойму, что не нравится gcc в первом случае? Я что-то не так делаю или gcc?
Так же gcc, в отличие от clang не воспринимает и такой код
template<typename T>
struct B {
void foo() {}
};
template<typename... Types>
struct A : public B<Types>... {
using B<Types>::B...;
void bar() {
(B<Types>::foo() , ...);
}
};
с несколько большим количеством ошибок
<source>:11:11: error: expected primary-expression before '>' token
11 | (B<Types>::foo() , ...);
| ^
<source>:11:14: error: '::foo' has not been declared
11 | (B<Types>::foo() , ...);
| ^~~
<source>:11:11: error: binary expression in operand of fold-expression
11 | (B<Types>::foo() , ...);
| ~~~~~~~^~~~~~~~
<source>:11:11: error: operand of fold expression has no unexpanded parameter packs
и опять же, если убрать наследование конструкторов,
//using B<Types>::B...;
то код компилируется