在MSVC 2017中继承模板构造函数和错误C2600

时间:2018-12-25 14:32:52

标签: c++ templates

我在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 :(得分:1)

已确认它是VS 2017中的错误,并且已在VS 2019 16.0.0 Preview 1- confirmed here中修复。无论如何,谢谢您的帮助!