.net C++/CLI终结器和运算符

.net C++/CLI终结器和运算符,.net,c++-cli,managed-c++,.net,C++ Cli,Managed C++,在以下示例中,我得到: error C2300: 'UnmanagedClass' : class does not have a finalizer called '!SmartPointer' 如果删除运算符->,此错误将消失。有人能解释为什么会这样吗 // Unmanaged class. class UnmanagedClass { }; public ref class SmartPointer { public: SmartPointer(UnmanagedClass*

在以下示例中,我得到:

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

您正在重写->运算符,因此当您这样做时:

~SmartPointer() { this->!SmartPointer(); }
你实际上是在打电话

~SmartPointer() { m_ptr->!SmartPointer(); }
我相信你可以通过这样做来解决这个问题,不过:

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

这很有道理,里德,谢谢你;真不敢相信我竟然没有意识到。不幸的是,我的操作符*也过载了。仅仅做~SmartPointer(){!SmartPointer();}也不行。明白了:~SmartPointer(){SmartPointer::!SmartPointer();}再次感谢。赖安