Generic::List を参照によって渡すにはどうすればよいですか?
-
22-08-2019 - |
質問
いくつかのアンマネージ コードをマネージド .dll にラップしようとして、 Generic::List
のデータポイントの std::vector
. 。これが私がやろうとしていることの一部です:
namespace ManagedDLL
{
public ref class CppClass
{
void ListToStdVec( const List<double>& input_list, std::vector<double>& output_vector )
{
// Copy the contents of the input list into the vector
// ...
}
void ProcessData( List<double> sampleData )
{
std::vector<double> myVec;
ListToStdVec( sampleData, myVec );
// Now call the unmanaged code with the new vector
// ...
}
}
}
これをコンパイルすると次のようになります。
エラー C3699:'&' :この間接指定は型 'const System::Collections::Generic::List' では使用できません
おそらくここで何か基本的なことを見逃していると思います (私は .net のやり方には比較的慣れていません) が、私にとってはかなり妥当なコードのように見えます。?
[編集] Andy と Dario の両方の提案を試してみましたが、うまくいきました。しかし、入力リストのメンバーにアクセスするにはどうすればよいでしょうか?あらゆる種類の dreferencing の組み合わせを試してみましたが、コンパイルできないようです。
void ListToStdVec( const List<double>% input_list, std::vector<double>& output_vector )
{
int num_of_elements = input_list->Count;
}
void ListToStdVec( const List<double>^ input_list, std::vector<double>& output_vector )
{
int num_of_elements = input_list.Count;
}
...両方とも次のようになります。
エラー C2662:'システム::コレクション::ジェネリック::リスト::カウント::get':「this」ポインタを「const System::Collections::Generic::List」から「System::Collections::Generic::List %」に変換できません
...それでは、どうやって参照/ポインタにアクセスするのでしょうか?
解決
として List<T>
はマネージド .NET クラスであり、C++ 参照ではなく、^ で示されるマネージド GC ハンドルによって渡されます。
元:
void ListToVec(List<double>^ input_list, std::vector<double>& out)
追加は必要ありません const
ここ。表記 List<T>^%
参照による呼び出しではなく、追跡参照 (C++ ポインターに相当) を作成します。メンバーにアクセスするだけです list->...
そして list[...]
.
他のヒント
によると ハーブサッター, %
管理オブジェクトの参照渡し文字です。コードを次のように変換すると、機能するはずです。
void ListToStdVec( const List<double>% input_list, std::vector<double>& output_vector
{
// Copy the contents of the input list into the vector
// ...
}
編集:私は思います const
原因はわかりませんが、問題が発生しています。を変更すると、 List
そうではないとする議論 const
, の場合、最初の関数は、 ->
演算子を使用すると、2 番目の関数はコンパイルされます。 .
演算子 (なぜその違いが存在するのかわかりません。あまり意味がありません)。
とはいえ、単に要素をコピーするだけの場合は、 List
に vector
, 、本当に使いたいのは ^
. 。これは、管理対象オブジェクトへの参照があると考えてください。私はそう思います %
参照を「参照によって」渡したい場合に使用されます(つまり、再割り当て input_list
自分の中の別のものに ListToStdVec()
, 、呼び出し元にその割り当ての結果を見てもらいます。ただし、 .
使用時にメンバーにアクセスするための演算子 %
, 、それは私にその目的をまったく理解していない可能性があることを示しています。