Финализаторы и операторы C ++ / CLI - PullRequest
4 голосов
/ 06 мая 2009

В следующем примере я получаю:

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

Если удалить оператор->, эта ошибка исчезнет. Может ли кто-нибудь объяснить, почему это происходит?

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

1 Ответ

5 голосов
/ 06 мая 2009

Вы переопределяете оператор ->, поэтому, когда вы делаете:

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

Вы фактически звоните

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

Я полагаю, что вы можете обойти это, сделав это, хотя:

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