MSVC не распознает «прямой» конструктор базового класса класса шаблона, наследующий класс шаблона - PullRequest
1 голос
/ 11 июня 2019

Это , а не дубликат этого вопроса .

Ниже я перечислю свой базовый класс, а также то, как я получаю класс из него:

template<template<size_t, typename...> typename D>
struct Modifier
{
    // some static variables
};

template<typename M, size_t U, typename T, typename... S>
struct Base
{
    // some implementations
};

template<size_t U, typename T>
struct Derived;

template<>
struct Modifier<Derived>;

template<size_t U, typename T>
struct Derived : Base<Modifier<Derived>, U, T, double>
{
    using Base<Modifier<Derived>, U, T, double>::Base;
};

Чтобы обеспечить некоторый контекст, идея состоит в том, что реализация Base будет обращаться к некоторым статическим переменным из M, чтобы изменить поведение пары функций.

Когда я компилирую это с помощью msvc (build tools v142), он жалуется на:

1>...: error C3210:  'Base<Modifier<Derived<2,unsigned __int64> >,2,unsigned __int64,double>': a member using-declaration can only be applied to a base class member
1>...: error C3881:  can only inherit constructor from direct base

Тем не менее, когда я ввожу using mod_t = Modifier<Derived>; и применяю это вместо реализации Derivedполного имени правильно компилируетсявсе равно получит ошибку.

Что мне здесь не хватает?

1 Ответ

0 голосов
/ 11 июня 2019

Эта проблема (с msvc) на самом деле связана с моим предыдущим вопросом здесь :

Упрощенный обходной путь, позволяющий избежать ввода имени класса, заключается в использовании полного имени.

В приведенном выше примере Derived должен иметь префикс ::Derived, после чего он успешно скомпилируется.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...