C2512错误使用ref类

时间:2017-07-21 11:47:45

标签: .net c++-cli

这绝对是一个出现了很多 - 但我认为这个版本有点不同。我的代码中出现以下错误 error C2512: 'DataTypes::DateTime': no appropriate default constructor available。最近在从.NET 2升级到.NET4.6

期间出现此错误

基本上我们有一个类似于以下内容的引用类:

public ref class DateTime : DataType {
    public:
        DateTime();
        //just highlighting that the constructor is available in the class and hasn't been missed
}

此类继承了具有静态构造函数的接口DataType - 如下所示:

public interface class DataType {
    static DataType() {
    }
}

然后这一切都被绑在另一个类中,这是我们得到错误的地方

public ref class DateCounter {
    static DateTime dateTime;
}

现在 - 我已设法使用以下

修复错误
public ref class DateCounter {
    static DateTime dateTime = new DateTime();
}

看起来强行告诉它使用这个构造函数 - 但是由于这种设置在应用程序中使用了很多,所以通过所有这些并修改它们是一项大工作。

我只是想知道是否有人知道一个更优雅的解决方案,或者至少可以说明为什么这两个版本的.NET之间会发生变化

编辑 - 所以我已经建立了一个小项目,看起来它正在做同样的事情。项目中有三个文件 - TestClass.h:

public ref class TestClass : TestInterface {
    protected:
        static int staticItem = 0;
        int holdInt;
    public:
        virtual void Clear();
        TestClass();
        static TestClass();
        TestClass(int takeIn);
        TestClass(TestClass% value);
        TestClass% operator= (TestClass% input);
};

TestClassMethods.h:

TestClass::TestClass() {

}

TestClass::TestClass(int takeIn) {
    this->holdInt = takeIn;
}

TestClass::TestClass(TestClass% value) {
    *this = value;
}

void TestClass::Clear() {
    this->holdInt = 0;
}

TestClass% TestClass::operator= (TestClass% toAssign) {
    this->holdInt = toAssign.holdInt;

    return *this;
}

和ClassLibrary1.cpp

namespace TestNamespace {
    ref class TestClass;

    public interface class TestInterface {
        void Clear();
    };

    public ref class Counter {
        static TestClass counterVariable;
    };
}

这些复制了如何在我正在处理的应用程序中设置代码的定义,并且应该产生问题

1 个答案:

答案 0 :(得分:0)

我认为这里的问题是你调用DateTime的默认(无参数)析构函数,它是一个值类型。隐式定义值类型的默认构造函数,并将此类型的实例设置为其默认值。

因此,要摆脱此错误消息,最简单的解决方法是使用其中一个参数化构造函数,例如: " new DateTime(0)",它产生与默认构造函数相同的值。另一个值得尝试的选择是使用特殊的#34;堆栈语义和#34; C ++ / CLI的语法,它可以透明地完成所有构造/销毁工作。为此,将DateTime实例声明为本地C ++变量:

DateTime vDateTime;

请注意,在这种情况下,不能指定空括号。 C ++编译器会将此识别为默认构造函数调用。参数化声明就像那样 - 现在带有必需的括号:

DateTime vDateTime (0);