0

我有我正在用 /clr 编译的项目。我有一个像下面这样的课..

ref class A
{
public:
 void CheckValue(void * test);
 typedef ref struct val
{
 std::string *x;
}val_t;

};

在我的实现中,我必须使用类似下面的东西..

void A::CheckValue(void *test)
{
 a::val_t^ allVal = (a::val_t^)test;
}

在我的主要我曾经使用过..

int main()
{
A^ obj = gcnew A();
a::val_t valObj = new std::string("Test");
obj->CheckValue((void*)valObj);
}

我收到类型转换错误和两个地方 - obj->CheckValue((void*)valObj); 在 obj->CheckValue((void*)valObj); 错误 C2440:“类型转换”:无法从“void*”转换为“A::val_t ^”

这个片段只是为了展示我的行为,我只能以这种方式使用它。早些时候我使用非 /clr 运行它,所以它编译得很好。

现在问题我有如何使这种类型转换在 C++/CLI 类型项目中工作?

4

2 回答 2

1

将 void * 替换为 Object^。您也可以编写 CheckValue 的泛型版本,但是当泛型参数中有类型时,使用弱类型参数没有多大意义。

引用句柄表示托管堆上的对象。与本机指针不同,CLR 可以在函数调用期间移动对象,因此指针和引用句柄的行为是不同的,并且类型转换会失败。如果您确实需要 void*,您也可以使用 pin_ptr 固定被引用的对象,这样 CLR 就不会在函数调用期间移动对象。

于 2013-05-24T06:43:03.813 回答
0

以下是我如何绕过您看到的限制,只需从托管对象中删除结构,因为它包含本机指针类型。

struct val_t
{
  char* x;
};

ref class A
{
public:
  void CheckValue(void* test);
};

void A::CheckValue(void* test)
{
  val_t* allVal = (val_t*)test;
}

int main()
{
  A^ obj = gcnew A();
  val_t valObj;
  valObj.x = "Test";
  obj->CheckValue((void*)&valObj);
}

现在,如果您绝对需要管理该结构,请执行以下操作:

ref class A
{
public:
  void CheckValue(void * test);
  value struct val_t
  {
    char* x;
  };
};

void A::CheckValue(void *test)
{
  a::val_t* allVal = (a::val_t*)test;
}

int main()
{
  A^ obj = gcnew A();
  a::val_t valObj;
  valObj.x = "Test";
  pin_ptr<a::val_t> valPin = &valObj;
  obj->CheckValue((void*)valPin);
}
于 2014-11-14T15:15:14.463 回答