2009-05-06 5 views
4

Dans l'exemple suivant, je reçois:C++/CLI Finaliseurs et opérateurs

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

Si je supprime le operator->, cette erreur disparaît. Quelqu'un pourrait-il expliquer pourquoi cela se produit?

// 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); 
} 

Répondre

5

Vous surchargeons l'opérateur ->, donc quand vous faites:

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

Vous appelez efficacement

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

Je crois que vous pouvez contourner ce problème en faisant , cependant:

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

Cela fait sens Reed, t vous hante; Je n'arrive pas à croire que je ne m'en suis pas rendu compte. Malheureusement, j'ai un opérateur * surchargé aussi. Just doing ~ SmartPointer() {! SmartPointer(); } ne fonctionne pas non plus. – Ryan

+3

Vous l'avez: ~ SmartPointer() {SmartPointer ::! SmartPointer(); } Merci encore. Ryan – Ryan

Questions connexes