1

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

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

我像这样重载 != 运算符:

bool operator !=(T *ptr) const; 

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

ZhjSmartPointer.h:132: 注意: 候选 1: bool ZhjSmartPointer::operator!=(T*) const [with T = Test] test.cpp:41: 注意: 候选 2: operator!=(int, int)

我对如何将 aZhjSmartPointer转换为a 感到困惑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);
如果 (a) { ..........
}

4

2 回答 2

1

在 C++NULL中被定义为0, not (void*)0,其实大部分教科书都会告诉你用0代替NULL.

如果你使用的是 C++11,你应该nullptr顺便使用


您的问题确实是bool隐式转换。要解决您的问题,请使用重载运算符 not ( !) 代替。

于 2013-02-21T05:16:30.973 回答
0

我猜是因为我重载了'bool'运算符,'ZhjSmartPointer -> bool -> 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>

已弃用

令人惊讶 NULL的是int,不是void*

像这样声明你的构造函数:

ZhjSmartPointer<int> a(new int);  

启用从 int 到ZhjSmartPointer. 相反,添加一个explicit

explicit ZhjSmartPointer<int> a(new int); 

来抑制这种转换。

于 2013-02-21T05:16:45.997 回答