よりスマートなポインター クラスを作成しました。そして、次のコードを正しくするには
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: 演算子!=(int, int)
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」がこの問題につながると思います.これは正しいですか?
申し訳ありませんが、これは単なるコンパイル警告であり、エラーではありません。!= を parameter(T *) でオーバーロードしないように提案する人がいます。結局のところ、既に 'bool' をオーバーロードしています。次のようなコードを記述しても問題ありません
。
もし (a) { ...........
}