1

我有定义属性的 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 相关联。Body如果对象引用由 const 传递,如何调用对象的属性?

4

2 回答 2

3

const 限定符是 C++/CLI 中的一个问题。它只有在可以检查时才有意义,而这在 .NET 中通常是不可能的。当您只有一种编译器并且该编译器遵循严格的语言规则时,这当然不是问题。就像 C++ 一样。但是 .NET 支持多种语言,例如,您的方法可以很容易地从 Cobol.NET 程序中调用。将 const 正确性添加到 Cobol 语言的几率为零。

编译器确实使用 const 限定符编译代码,努力检查何时可以。这就是你得到诊断的原因。当声明存在于另一个程序集中时,这甚至可以工作,只要它是使用 C++/CLI 编译的,编译器就会在元数据中发出 modopt 注释。

但这也有局限性。属性就是其中之一,你不能将 const 限定符添加到 getter 或一般的成员函数,你会被 C3842 拍打。

最好的办法是使用 C++/CLI 来做它擅长的事情,它是一种互操作语言。并且 const 限定符在互操作场景中不能很好地工作。

于 2012-10-23T10:44:54.420 回答
0

我知道解决这个问题的唯一方法是抛弃 const-ness。只要不修改对象,应该没问题。(如果你修改它,我不知道结果会是什么)。
即改变你的功能是

void foo(const AbstractOffer^ ao)
{
  const_cast<AbstractOffer^>(ao)->Body;
}
于 2012-10-23T10:38:45.193 回答