VB.netのクラスのC++/CLIへの配列の移植がうまくいきません。

huahi11115 335 評価のポイント
2024-04-10T02:48:03.3766667+00:00

VB.netのクラスのC++/CLIへの移植がうまくいきません。

<VB.net>正常にコンパイルでき、動作する

Class test0401

Public Property arr1() = {}

Public Sub New()

  arr1 = {1, 7, 4}

End Sub

End Class

<C++/CLI>正常にコンパイルでき、動作する

public ref class test0402

{

public:

	int FG1;  //①これはpublicで公開できている

	array<int>^ arr1 ;//② これはコンパイルできる

sub1(){

array<int>^ a = { 5, 4, 1, 3, 2 }; //コンパイルが通り、正常に動作する

}

};

実際の運用では、VB.netの用例 Public Property arr1() = {} と同じ、1行の中に配列の初期値を格納しなければなりません。

②の行で、ref classの直下にpublicのプロパティーを作成したいので、

public:

array<int>^ arr1 = { 5, 4, 1, 3, 2 }; と記述すると、2番目の要素、「4」の部分で、

E0146 初期化子の値が多すぎます というエラーが出てコンパイルできません。

このエラーの意味と解決法がわかりませんので、教えて下さい。

.NET
.NET
.NET ソフトウェア フレームワークに基づく Microsoft テクノロジ。
70 件の質問
C++
C++
C プログラミング言語の拡張機能として作成された高レベルの汎用プログラミング言語。低レベルのメモリ操作機能に加えて、オブジェクト指向、汎用、関数型の機能を備えています。
23 件の質問
{count} 件の投票

承認済みの回答
  1. gekka 9,911 評価のポイント MVP
    2024-04-10T14:40:48.3966667+00:00

    C++/CLIの仕様なのかフィールドだと初期化を受け付けないようなので、むりやり一行にしてみる

    #include "pch.h"
    #include <array>
    
    using namespace System;
    
    template<typename T>
    static cli::array<T>^ initListToArray(std::initializer_list<T> list)
    {
    	cli::array<T>^ ar = gcnew cli::array<T>(list.size());
    	pin_ptr<T> p = &ar[0];
    	memcpy(p, list.begin(), list.size() * sizeof(T));
    	//int i = 0; for (T t : list) { ar[i++] = t; }
    	return ar;
    };
    
    ref class test0402
    {
    public:
    	test0402()
    	{
    		arr1 = gcnew array<int> { 5, 4, 3, 1, 3, 2 };
    	}
    
    	// コンストラクタで
    	public: cli::array<int>^ arr1;
    
    	// 無理やりワンライナー
    	public: cli::array<int>^ arr2 = init_arr1();  private: static cli::array<int>^ init_arr1() { return gcnew cli::array<int> { 1, 3, 5, 7, 9 }; };
    
    	// テンプレートで
    	public: cli::array<double>^ arr3 = initListToArray({ 1.2, 3e4, -5.6 });
    	public: cli::array<String^>^ arr4 = initListToArray({ gcnew String("あいうえお"),gcnew String("かきくけこ") });
    };
    
    int main(array<System::String^>^ args)
    {
    	test0402^ t = gcnew test0402();
    	for each (auto i in t->arr1) { System::Console::WriteLine(i); }
    	for each (auto j in t->arr2) { System::Console::WriteLine(j); }
    	for each (auto d in t->arr3) { System::Console::WriteLine(d.ToString(L"e2")); }
    	for each (auto s in t->arr4) { System::Console::WriteLine(s); }
    	return 0;
    }
    
    1 人がこの回答が役に立ったと思いました。

0 件の追加の回答

並べ替え方法: 最も役に立つ

お客様の回答

回答は、質問作成者が [承諾された回答] としてマークできます。これは、ユーザーが回答が作成者の問題を解決したことを知るのに役立ちます。