我写了一个更聪明的指针类。并使以下代码正确

ZhjSmartPointer<int> a(new int);
assert(a != NULL);

我像这样重载!=运算符:
bool operator !=(T *ptr) const;

但是,这会导致如下编译错误:



我对如何将ZhjSmartPointer转换为int感到困惑

SmartPointer类的代码如下所示:
template <typename T>
class ZhjSmartPointer {
public:
    ZhjSmartPointer();
    explicit ZhjSmartPointer(T *ptr);

    ZhjSmartPointer(const ZhjSmartPointer &smartPtr);
    ZhjSmartPointer &operator =(const ZhjSmartPointer &smartPtr);
    ~ZhjSmartPointer();

    operator bool() const;
    T &operator *() const;
    T *operator ->() const;
    bool operator ==(const ZhjSmartPointer &smartPtr) const;
    bool operator !=(const ZhjSmartPointer &smartPtr) const;

    bool operator ==(T *ptr) const;
    bool operator !=(T *ptr) const;

private:
    void copyPtr(const ZhjSmartPointer &smartPtr);
    void deletePtr();
    T *ptr_;
    size_t *refCnt_;
};

我猜是因为我重载了'bool'运算符,'ZhjSmartPointer-> bool-> int'导致了这个问题。

对不起,这只是一个编译警告,不是错误。有人建议我不要用参数(T *)重载!=,毕竟我们已经重载了'bool',写这样的代码会很好:
ZhjSmartPointer a(new int);
如果一个) {
.....
}

最佳答案



我想是这样。

但是,您是否为ZhjSmartPointer定义了任何转换运算符?

#include <cassert>
#include <cstddef>

template <class T>
class ZhjSmartPointer{
    public:
    ZhjSmartPointer (T* _ptr)
    :ptr_saved(_ptr){    }
    bool operator !=(T *ptr) const{
        return ptr!=ptr_saved;
    }
    private:
    T* ptr_saved;
};
int main(){
    ZhjSmartPointer<int> a(new int);
    assert(a != NULL);
}

这虽然为我编译(g++ 4.6.3)。
添加:
    operator bool() const{
        return ptr_saved!=0;
    }
g++ 4.6.3发出警告,但仍可以编译。
1.cpp:9:14: Candidate 1: bool ZhjSmartPointer<T>::operator!=(T*) const [with T = int]
1.cpp:20:9: Candidate 2: operator!=(int, int) <builtin>

已弃用

令人惊讶的是,NULLint,而不是void*

像下面这样声明您的构造函数:
ZhjSmartPointer<int> a(new int);

启用从int到ZhjSmartPointer的转换。而是添加一个explicit:
explicit ZhjSmartPointer<int> a(new int);

抑制这种转换。

09-30 12:45