我有用/ 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->校验值((无效*)valObj); 并在 obj->校验值((无效*)valObj); 错误C2440:'type cast':无法从'void *'转换为'A :: val_t ^'
这个片段只是为了展示我的行为,我只能这样使用它。之前我使用non / clr运行它,所以它编译得很好。
现在问我怎样才能在C ++ / CLI类型的项目中进行这种类型的转换?
答案 0 :(得分:1)
用Object ^替换void *。您也可以编写CheckValue的通用版本,但是当您在泛型参数中有类型时,没有太多关于弱类型参数的信息。
引用句柄表示托管堆上的对象。与本机指针不同,CLR可以在函数调用期间移动对象,因此指针和引用句柄的行为是不同的,并且类型转换将失败。如果确实需要void *,也可以使用pin_ptr固定被引用的对象,这样CLR就不会在函数调用期间移动对象。
答案 1 :(得分: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);
}