我有定义属性的C ++ / CLI类:
public ref class AbstractOffer
{
public:
AbstractOffer();
property String^ Body;
};
在某些函数中,AbstractOffer
类由const ref
foo(const AbstractOffer^ ao)
{
ao->Body;
}
当我调用属性时,方法编译器会出现以下错误: -
错误C2662:'ivrworx :: interop :: AbstractOffer :: Body :: get':不能 将'this'指针从'const ivrworx :: interop :: AbstractOffer'转换 'ivrworx :: interop :: AbstractOffer%'1>转换失败 限定符
似乎以某种方式连接到const。如果对象引用由const传递,那么如何调用对象的Body
属性?
答案 0 :(得分:3)
const限定符是C ++ / CLI中的一个问题。它只有在可以检查时才有意义,并且在.NET中通常不可能。当你只有一种编译器并且编译器遵循严格的语言规则时,它当然不是问题。像C ++一样。但.NET支持许多语言,例如,可以从Cobol.NET程序轻松调用您的方法。将Cobol语言添加到const-correctness的可能性为零。
编译器使用const限定符编译代码, 努力检查它何时可以。这就是你获得诊断的原因。当声明存在于另一个程序集中时,它甚至可以工作,只要它是用C ++ / CLI编译的,编译器就会在元数据中发出modopt注释。
但是这方面有局限性。属性是其中之一,你不能将const限定符添加到getter,或者一般的成员函数,你会被C3842打耳光。
最好的办法是使用C ++ / CLI来擅长它,它是一种互操作语言。 const限定符在互操作场景中效果不佳。
答案 1 :(得分:0)
我知道绕过这个的唯一方法是抛弃常数。只要你不修改对象,它应该没问题。 (如果你修改它,我不知道结果会是什么) 即将你的职能改为
void foo(const AbstractOffer^ ao)
{
const_cast<AbstractOffer^>(ao)->Body;
}