Какой правильный синтаксис для указания класса c ++ / cli в качестве типа TValue в словаре - PullRequest
1 голос
/ 06 августа 2011

У меня возникают проблемы с синтаксисом в c ++ / cli, когда я пытаюсь определить структуру значения c ++ / cli как TValue в Словаре

Я делаю это, потому что хочу сохранить карту междусобственный указатель класса и system :: String (с ключом String), поэтому обернутый собственный указатель в структуру.

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);
}

Это дает ошибку компилятора: ошибка C2664: 'System :: Collections:: Generic :: Dictionary :: TryGetValue ': невозможно преобразовать параметр 2 из MyStruct ^ в MyStruct%

Я пробовал различные объявления MyStruct, но безуспешно.

Ответы [ 2 ]

7 голосов
/ 07 августа 2011

В вашем фрагменте много тонких синтаксических ошибок, вы можете воспользоваться праймером C ++ / CLI:

  1. для объявления типа значения требуется точка с запятой. Правило C ++
  2. Словарь <> является ссылочным типом, поэтому требуется. Правило C ++ / CLI
  3. передача аргумента по ссылке подразумевается объявлением, не используйте%. Правило C ++
  4. Недопустимый NULL в управляемом коде, необходимо использовать nullptr . Правило C ++ / CLI

Таким образом:

#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...
};
2 голосов
/ 06 августа 2011

Должно быть просто

m_LigandToModelMap.TryGetValue(file, m)

В C ++ аргументы byref не предоставляют подсказки вызывающей стороне.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...