Наследование конструктора шаблона и ошибка C2600 в MSVC 2017 - PullRequest
0 голосов
/ 25 декабря 2018

Я столкнулся с ошибкой компиляции на VS 2017 15.9.4 (набор инструментов v141), который использовался для работы с VS 2015 (набор инструментов v140).Проблема заключается в наследовании шаблонного конструктора от базового класса.

#include <type_traits>

template <typename T>
class IAttribute {
public:
    template <
        typename U = T,
        typename = typename std::enable_if<std::is_default_constructible<U>::value>::type
    >
    IAttribute() {}

    IAttribute(T* value) {
    }

private:
    T* m_value;
};

class AttributeInt : public IAttribute<int> {
public:
    using IAttribute<int>::IAttribute;

    AttributeInt();
};

AttributeInt::AttributeInt() : IAttribute<int>(nullptr) {

}

int main() {
    AttributeInt qq;
}

В последней версии VS я получаю ошибку:

ошибка C2600: «AttributeInt :: AttributeInt ': не может определитьГенерируемая компилятором специальная функция-член (сначала должна быть объявлена ​​в классе)

Через некоторое время я обнаружил, что перемещение реализации конструктора AttributeInt() в тело определения класса исправляет ошибку.

class AttributeInt : public IAttribute<int> {
public:
    using IAttribute<int>::IAttribute;

    AttributeInt() : IAttribute<int>(nullptr) {}
};

Это, однако, не решает мою проблему, потому что в моем проекте мне нужно создать производный класс, который зависит от этого класса.Любые идеи, как решить эту проблему без перемещения реализации ?

В любом случае, оригинальный код работает на GCC 8.2, clang 7.0.0, zapc ++ 2017.08 и MSVC 2015.

1 Ответ

0 голосов
/ 27 декабря 2018

Подтверждено как ошибка в VS 2017 и исправлено в VS 2019 16.0.0 Предварительный просмотр 1 - подтверждено здесь .В любом случае, спасибо за помощь!

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