Я столкнулся с ошибкой компиляции на 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.