1

管理されていないコードを管理された.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の両方の提案を試しましたが、それらは機能しますが、入力リストのメンバーにアクセスするにはどうすればよいですか?あらゆる種類の参照の組み合わせを試しましたが、何もコンパイルされていないようです。

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:'System :: Collections :: Generic :: List :: Count :: get':この'ポインタを' const System :: Collections :: Generic::List'から'System:: Collections::に変換できませんGeneric :: List% '

...では、どのようにして参照/ポインタにアクセスしますか?

4

2 に答える 2

2

ハーブサッターによると、%は参照文字による管理対象オブジェクトの受け渡しです。コードを次のように変換すると、機能するはずです。

void ListToStdVec( const List<double>% input_list, std::vector<double>& output_vector
{
    // Copy the contents of the input list into the vector
    // ...
}

編集const:理由はわかりませんが、が問題の原因だと思います。List引数をnotに変更するconstと、最初の関数は演算子を使用する->とコンパイルされ、2番目の関数は.演算子を使用するとコンパイルされます(なぜその違いが存在するのかわかりません-あまり意味がありません)。

Listとは言うものの、あなたがしたいのがの要素をにコピーすることだけであるなら、vectorあなたは本当にを使いたいのです^。これは、管理対象オブジェクトへの参照があると考えてください。%これは、参照を「参照によって」渡す場合(つまり、input_list内の他の何かに再割り当てし、呼び出し元にその割り当ての結果を表示させる場合)に使用されると思いListToStdVec()ます。ただし、を使用する.ときに演算子を使用してメンバーにアクセスする場合%は、それは私がその目的を全く理解していないかもしれないことを私に教えてくれます。

于 2009-05-19T16:09:38.983 に答える
1

マネージド.NETクラスと同様List<T>に、C ++参照ではなく、^で示されるマネージドGCハンドルによって渡されます。

元:

void ListToVec(List<double>^ input_list, std::vector<double>& out)

ここに追加する必要はありませんconst。この表記List<T>^%は、参照による呼び出しではなく、追跡参照(C ++ポインターと比較可能)を作成します。list->...とでメンバーにアクセスするだけですlist[...]

于 2009-05-19T16:09:19.483 に答える