2012-10-22 57 views
1

我具有定義的性質C++/CLI類:呼籲const引用的屬性

public ref class AbstractOffer 
{ 
    public: 
    AbstractOffer(); 

    property String^ Body; 
}; 

在一些功能AbstractOffer類是由常量REF

foo(const AbstractOffer^ ao) 
{ 
    ao->Body; 
} 

通過當我打電話屬性方法編譯器給出以下錯誤: -

錯誤C2662:'ivrworx :: interop :: AbstractOffer :: Body :: get':不能 轉換 '這個' 由指針 'const的ivrworx ::互操作:: AbstractOffer' 爲 'ivrworx ::互操作:: AbstractOffer%' 1>轉換失去 限定符

它看起來有點連接到常量。如果對象引用被const傳遞,我該如何調用對象的Body屬性?

+0

你不能,那是常數。也許你可以考慮你的功能呢? – alestanis

+0

這很奇怪,屬性的get()函數應該是隱含的const。那麼調用它有什麼問題? – Boris

+0

你不是調用getter,而是調用屬性本身,它是一個'public'屬性。如果你在這種情況下寫一個const getter,會怎麼樣? (並使該屬性保密) – alestanis

回答

0

我知道解決這個問題的唯一方法是拋棄常量。只要你不修改對象,它應該沒問題。 (如果你修改它,我不知道結果會是什麼)。
即改變你的功能是

void foo(const AbstractOffer^ ao) 
{ 
    const_cast<AbstractOffer^>(ao)->Body; 
} 
3

的const限定符是在C++/CLI中的問題。它只有在它可以被檢查時纔有意義,而這在.NET中通常是不可能的。當你只有一種編譯器並且編譯器遵循嚴格的語言規則時,這當然不是問題。像C++一樣。但.NET支持許多語言,例如,您可以從Cobol.NET程序輕鬆調用您的方法。 Cobol語言增加的常量正確性的機率爲零。

編譯器確實與常量預選賽編譯代碼和確實作出努力來檢查時就可以了。這就是爲什麼你得到診斷。如果聲明存在於另一個程序集中,只要它是用C++/CLI編譯的,編譯器會在元數據中發出modopt註釋,甚至可以工作。

但是有一些限制。屬性就是其中之一,你不能將const限定符添加到getter或一般的成員函數中,你會被C3842拍打。

最好的做法是使用C++/CLI進行優化,它是一種互操作語言。而const限定符在互操作場景中不起作用。