在const引用上调用属性

时间:2012-10-22 07:00:15

标签: windows c++-cli

我有定义属性的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属性?

2 个答案:

答案 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;
}