将C ++ / cli类指定为Dictionary中的TValue类型的正确语法是什么

时间:2011-08-06 18:11:50

标签: dictionary c++-cli

当我尝试将c ++ / cli值结构定义为字典中的TValue时,我在c ++ / cli中的语法出现问题

我这样做是因为我想在本机类指针和system :: String(以String作为键)之间维护一个映射,所以将本机指针包装在一个struct中。

value struct MyStruct
{
   NativeClass *m_p;
}

Dictionary<System::String ^, MyStruct> MyMap;

NativeClass* FindLigandModelMap(System::String ^file)
{
   MyStruct m;
   if (m_LigandToModelMap.TryGetValue(file, %m)) <--- ERROR HERE
      return(m.m_p);
   return(NULL);
}

Thi给出编译错误:错误C2664:'System :: Collections :: Generic :: Dictionary :: TryGetValue':无法将参数2从'MyStruct ^'转换为'MyStruct%'

我尝试了各种MyStruct声明但没有成功。

2 个答案:

答案 0 :(得分:7)

您的代码段中有许多细微的语法错误,您可能会从C ++ / CLI入门中受益:

  1. 值类型声明需要分号。 C ++规则
  2. 词典&LT;&GT;是一个参考类型,需要帽子。 C ++ / CLI规则
  3. 声明暗示
  4. 通过引用传递参数,不要使用%。 C ++规则
  5. NULL在托管代码中无效,您必须使用 nullptr 。 C ++ / CLI规则
  6. 因此:

    #include "stdafx.h"
    #pragma managed(push, off)
    class NativeClass {};
    #pragma managed(pop)
    
    using namespace System;
    using namespace System::Collections::Generic;
    
    value struct MyStruct
    {
        NativeClass *m_p;
    };   // <== 1
    
    ref class Example {
    public:
        Dictionary<System::String ^, MyStruct>^ MyMap;   // <== 2
    
        NativeClass* FindLigandModelMap(System::String ^file)
        {
            MyStruct m;
            if (MyMap->TryGetValue(file, m))  // <== 3
                return(m.m_p);
            return nullptr;  // <== 4
        }
        // etc...
    };
    

答案 1 :(得分:2)

应该只是

m_LigandToModelMap.TryGetValue(file, m)

在C ++中,byref参数不提供任何调用方提示。