2009-05-06 13 views
4

次の例では、私が取得:C++/CLIファイナライザと演算子

error C2300: 'UnmanagedClass' : class does not have a finalizer called '!SmartPointer' 

私はoperator-を削除する場合>、このエラーが表示されなくなります。誰かがなぜこれが起こっているのか説明できますか?

// Unmanaged class. 
class UnmanagedClass { }; 

public ref class SmartPointer { 
public: 
    SmartPointer(UnmanagedClass* u) : m_ptr(u) { } 
    ~SmartPointer() { this->!SmartPointer(); } 
    !SmartPointer() { delete m_ptr; } 

    // This line triggers C2300. 
    UnmanagedClass* operator->() { return m_ptr; } 
}; 

int main() { 
    SmartPointer^ s = gcnew SmartPointer(new UnmanagedClass); 
} 

答えて

5

あなたがオーバーライドしている - >演算子をので、あなたが行うとき:

~SmartPointer() { this->!SmartPointer(); } 

あなたが効果的に私はあなたがこれを行うことによってこの問題を回避できると信じて

~SmartPointer() { m_ptr->!SmartPointer(); } 

を呼んでいますただし、

~SmartPointer() { (*this).!SmartPointer(); } 
+0

Reed、tあなたをハンクします。私がそれを認識していないとは信じられない。残念ながら、私は演算子*もオーバーロードされています。ちょうどやっている 〜SmartPointer(){!SmartPointer(); } も動作しません。 – Ryan

+3

入手した: 〜SmartPointer(){SmartPointer ::!SmartPointer(); } もう一度ありがとうございます。ライアン – Ryan