我在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上运行。