我写了一个更聪明的指针类。并使以下代码正确
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>
已弃用
令人惊讶的是,
NULL
是int
,而不是void*
。像下面这样声明您的构造函数:
ZhjSmartPointer<int> a(new int);
启用从int到
ZhjSmartPointer
的转换。而是添加一个explicit
:explicit ZhjSmartPointer<int> a(new int);
抑制这种转换。