2017-07-21 6 views
0

これは間違いなく多くなってきたものですが、私はこのバージョンは多少異なると思います。コードに次のエラーが表示されます error C2512: 'DataTypes::DateTime': no appropriate default constructor availableこのクラスが持つインターフェースDataTypeのオフ継承C2512エラーrefクラスを使用して

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

:このエラーは、最近、我々は次のような参照クラスを持っている基本的に.NET4.6

に.NET 2からアップグレード中に登場しています - 静的コンストラクタは次のようになります。

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

そしてこれは、すべて私たちがエラーに

を取得したところで、別のクラスの内部で縛られます
public ref class DateCounter { 
    static DateTime dateTime; 
} 

は今 - 私はこのコンストラクタを使用するためにそれを伝える、強制的になりそうだ、次の

public ref class DateCounter { 
    static DateTime dateTime = new DateTime(); 
} 

とエラーを修正するために管理してきました - しかし、セットアップのこの種として以内に非常に多く使用されていますアプリケーション、それはすべてを通過し、それらを修正する大きな仕事です。

私は誰もが、よりエレガントな解決策を知っていたならばちょうど思っていたか、少なくともこれは.NET

編集の2つのバージョン間で変更されているだろう理由与えることができる - だから私は設定した をそれは同じことをしているように見える小さなプロジェクトです。プロジェクト内の3つのファイルがあります - 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

これはC++ではありません。それはマイクロソフトのC++/CXのように見える(C++/CLIと改名された?)。 – molbdnilo

+0

はい、それは正しいでしょう - それはC + +のCLIです - 私はタグを更新します –

+0

私は同様のコンセプトを持っていましたが、私はCLRが静的なインターフェイスの定義をサポートしていないと言われました。そしてあなたのクラスが静的コンストラクタを実装するための実際の制約はありません。しかし、静的なDateTime^dateTime;または '値の型'を検索するだけです([link](https://stackoverflow.com/questions/8919032/where-is-this-managed-object-stored/)。 8920544#8920544))。一時的に私の似たような問題が取り消されました:[リンク](https://stackoverflow.com/questions/35085770/is-there-some-easy-workaround-to-the-compile-error-c3232)。以下にいくつかの便利なコメントがありました。 – SchLx

答えて

0

ここでの問題は、値型であるDateTimeのデフォルト(パラメータなし)デストラクタを呼び出すことだと思います。値型のデフォルトコンストラクタは暗黙的に定義され、この型のインスタンスをデフォルト値に設定します。

このエラーメッセージを取り除くには、最も簡単な回避策は、パラメータ化されたコンストラクタの1つを使用することです。 "new DateTime(0)"。既定のコンストラクタと同じ値が返されます。試みる価値のあるもう1つのオプションは、C++/CLIの特別な「スタック・セマンティクス」構文を使用することです。これは、すべての構築/破壊が透過的に行われます。このためには、単にローカルC++変数のようにDateTimeのインスタンスを宣言:空の括弧は、この場合に指定されてはならないこと

DateTime vDateTime; 

注意を。 C++コンパイラはこれをデフォルトのコンストラクタ呼び出しとして認識します。パラメータ化された宣言はそのようになります - 今必要なカッコで:

DateTime vDateTime (0); 
関連する問題