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: 演算子!=(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) { ...........
}

4

2 に答える 2

1

C++ では、 はではなくNULLとして定義されています。実際、ほとんどの教科書ではの代わりにを使用するように指示されています。0(void*)00NULL

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 に答える