Type casting in C++\CLI project
我有一个正在用 /clr 编译的项目。我有一个像下面这样的课程..
1 2 3 4 5 6 7 8 9 10 | ref class A { public: void CheckValue(void * test); typedef ref struct val { std::string *x; }val_t; }; |
在我的实现中,我必须使用类似下面的东西..
1 2 3 4 | void A::CheckValue(void *test) { a::val_t^ allVal = (a::val_t^)test; } |
在我的主目录中,我使用了 like..
1 2 3 4 5 6 | 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 类型项目中工作?
将 void * 替换为 Object^。您也可以编写 CheckValue 的泛型版本,但是当泛型参数中有类型时,使用弱类型参数没有多大意义。
引用句柄代表托管堆上的一个对象。与本机指针不同,CLR 可以在函数调用期间移动对象,因此指针和引用句柄的行为是不同的,并且类型转换会失败。如果您确实需要一个 void*,您也可以使用 pin_ptr 固定被引用的对象,这样 CLR 就不会在函数调用期间移动该对象。
这是我将如何绕过您所看到的限制,只需从托管对象中删除结构,因为它包含本机指针类型。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | 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); } |
现在,如果您绝对需要管理该结构,请执行以下操作:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | 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 valPin = &valObj; obj->CheckValue((void*)valPin); } |