アンマネージ コードから呼び出すことができるメソッドをエクスポートしていますが、関数自体はマネージ C++ プロジェクトにあります。次のコードでは、コンパイラ エラーが発生します。
error C2526: 'System::Collections::Generic::IEnumerator<T>::Current::get' : C linkage function cannot return C++ class 'System::Collections::Generic::KeyValuePair<TKey,TValue>'
error C2526: 'System::Collections::Generic::Dictionary<TKey,TValue>::KeyCollection::GetEnumerator' : C linkage function cannot return C++ class 'System::Collections::Generic::Dictionary<TKey,TValue>::KeyCollection::Enumerator'
extern "C"
__declspec( dllexport )
bool MyMethod(std::string &name, std::string &path, std::map<std::string, std::string> &mymap)
{
System::Collections::Generic::Dictionary<System::String ^, System::String^> _mgdMap = gcnew System::Collections::Generic::Dictionary<System::String ^, System::String ^>();
// Blah blah processing
}
このエラーを少し調べてみると、通常、この問題は「extern "C"」とマークされているメソッドの定義に関係しています。では、なぜメソッド内で何が起こっているのかに関心があるのでしょうか?
Dictionary の初期化をコメント アウトするか、HashTable に切り替えると、すべてが美しくコンパイルされます。
以下も同様に機能します。辞書をローカルで定義する代わりに、メソッドで初期化することでローカル変数を回避します。
bool status = CallAnotherMethod(ConvertToDictionary(mymap));
ConvertToDictionary が次のように宣言されている場所
System::Collections::Generic::Dictionary<System::String ^, System::String ^>^ ConvertToDictionary(std::map<std::string, std::string> &map)
{
}
これは、これが一見恣意的なエラーであることを示しています。コンパイラがこれを問題と考える理由を理解したいと思います。