VB.netコードのC++/CLIへの移植がうまくいきません。

huahi11115 340 評価のポイント
2024-04-15T08:06:58.42+00:00

<VB.net >

  Dim SL1 As New HashSet(Of String)

  SL1.Add("###")

  Dim s1 = SL1(0)

※これは、成功します。

しかし、Copilotを使って翻訳すると(ライブラリーの参照の仕方は、現在作成中のプロジェクトに合わせてあります。)

<C++/CLI>

#using <System.Core.dll>//これを記述しないとHashSetが使えない

using namespace System::Collections::Generic;

void tests01() {



System::Collections::Generic::HashSet<String^> ^sl1 = gcnew System::Collections::Generic::HashSet<String^>();

sl1->Add("###");

String^ str1 = sl1[0];//①

//エラー (アクティブ) E2242 式には pointer-to-object または handle-to-C++/CLI-array 型を使用する必要がありますが、型 "System::Collections::Generic::HashSet<System::String ^> ^" が使用されています

①の行でエラーになりますが、エラーの意味が理解できません。

どうすればコンパイルが通りますか。

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

承認済みの回答
  1. とっちゃん 625 評価のポイント MVP
    2024-04-15T12:55:37.1+00:00

    HashSet::operator に相当するものは、C++/CLI にはありません。

    VB の HashSet の SL1(0) は IEnumerable のシンタックスシュガー(糖衣構文)なので、これを使わない記述をする必要があります。

    今回なら

    HashSet<T> 型の集合体から配列の0番目の要素に当たるものを取得するにはどうすればいいか?

    ということですね。
    ここから先は、一度 HashSet<T>のリファレンス を見てから読んでほしいところではありますが、HashSet<T> は IEnumerable<T> を実装していますので IEnumerator<T> を利用してループアクセスすることになります。0番目(最初の一つ目)なら、単純に sl1->GetEnumerator()->Currentでアクセスできます。 そうではなく、n番目(列挙している)ということなら、for eachを使ってループを回しましょう。冷たい言い方かもしれませんが、この先もC++/CLIへの移植を続けるなら、どうやってカウントすればいいかは自分で考えてください。

    1 人がこの回答が役に立ったと思いました。

0 件の追加の回答

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

お客様の回答

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