Ошибка 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...;

то код компилируется


Ответы (0 шт):