这绝对是一个出现了很多 - 但我认为这个版本有点不同。我的代码中出现以下错误
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;
};
}
这些复制了如何在我正在处理的应用程序中设置代码的定义,并且应该产生问题
答案 0 :(得分:0)
我认为这里的问题是你调用DateTime的默认(无参数)析构函数,它是一个值类型。隐式定义值类型的默认构造函数,并将此类型的实例设置为其默认值。
因此,要摆脱此错误消息,最简单的解决方法是使用其中一个参数化构造函数,例如: " new DateTime(0)",它产生与默认构造函数相同的值。另一个值得尝试的选择是使用特殊的#34;堆栈语义和#34; C ++ / CLI的语法,它可以透明地完成所有构造/销毁工作。为此,将DateTime实例声明为本地C ++变量:
DateTime vDateTime;
请注意,在这种情况下,不能指定空括号。 C ++编译器会将此识别为默认构造函数调用。参数化声明就像那样 - 现在带有必需的括号:
DateTime vDateTime (0);