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では一般的に不可能です。もちろん、コンパイラが1種類しかなく、そのコンパイラが厳密な言語規則に従っている場合は問題ありません。C++のように。ただし、.NETは多くの言語をサポートしているため、たとえば、Cobol.NETプログラムからメソッドを簡単に呼び出すことができます。Cobol言語にconst-correctnessが追加される可能性はゼロです。

コンパイラー、const修飾子を使用てコードをコンパイルし、可能な場合はチェックするように努めます。それがあなたが診断を受けた理由です。これは、宣言が別のアセンブリに存在する場合でも機能します。C++ / CLIでコンパイルされている限り、コンパイラはメタデータでmodoptアノテーションを発行します。

しかし、それには制限があります。プロパティはそのうちの1つであり、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 に答える