Clang не видит конструкторов базового класса, втянутых через псевдоним типа типаC++

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

Сообщение Anonymous »

Этот код принимается GCC (несколько версий) и отказан Clang (также несколько версий): < /p>

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

struct ACS{};

template
struct AD{};

template
struct PA{
explicit PA(ACS&) {}
};

template
struct AA : public PA< AA, AD >
{
using base = PA< AA, AD >;
using base::PA;
// accepted by both: using base::base;
};

int main()
{
ACS acs;
AA aa{acs};
}
< /code>
Для меня это похоже на той же ситуации, что и Clang не видит конструкторов базовых классов, втянутых через Typedef. Однако вместо сообщения об ошибке «без сопоставления конструктора» Clang выдает это сообщение об ошибке: < /p>

:15:17: error: dependent using declaration resolved to type without 'typename'
using base::PA;
^
По -видимому, Clang ожидает ключевого слова Typename . Подсказка предлагает добавить его до pa , но это:

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

using base:: typename PA;
< /code>
глупо и отвергается обоими компиляторами. Однако более разумная альтернатива: < /p>
using typename base::PA;
< /code>
принимается без синтаксической ошибки, но теперь Clang жалуется: < /p>
:22:21: error: no matching constructor for initialization of 'AA'
AA aa{acs};
^ ~~~~~
В отличие от Base :: base принимается обоими компиляторами, даже без типна имени . Фактически, использование Base :: Base принимается только GCC; Кланг жалуется: < /p>

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

:18:27: error: typename is allowed for identifiers only
using typename base::base;
~~~~~~~~~       ^
< /code>
Что происходит? Почему использование base :: pa 
отличается от использования Base :: base ? Разве база не псевдоним pa ?


Подробнее здесь: https://stackoverflow.com/questions/794 ... type-alias
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

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