나는 더 똑똑한 포인터 클래스를 작성했습니다. 그리고 올바른 다음 코드를 만들기 위해오버로드 연산자! =
이 같은 = 연산자 오버로드ZhjSmartPointer<int> a(new int);
assert(a != NULL);
:
ZhjSmartPointer.h이 같은 컴파일 오류에
bool operator !=(T *ptr) const;
그러나,이 리드를! : 132 : 참고 : 후보 1 : bool ZhjSmartPointer :: operator! = (T *) const [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_;
};
, 'ZhjSmartPointer -> bool -> int'로하면이 문제가 발생합니다. 맞습니까?
죄송 합니다만, 이것은 단지 컴파일 경고 일 뿐이며 오류는 아닙니다. 누군가 오버로드하지 말 것을 제안합니다! = 매개 변수 (T *)로, 결국 우리는 'bool'을 오버로드했습니다. 다음과 같은 코드를 작성하면됩니다.
ZhjSmartPointer a (new int);
(A) { ..........
} NULL
++ C에서
'명시 적'이 아닌 매개 변수로 'int'를 사용하는 생성자가 해당 변환을 유발할 수 있습니다. – phoeagon
생성자는'int' (잘 T)가 아니라'int *'(T *)를 취할 것이므로 "암시 적 생성자 변환"이 존재하지 않는다는 것은별로 의미가 없습니다. 'ZhjSmartPointer'에서'int'로 암시 적 변환을 허용하여이 오류를 유발할 수 있다는 가정은 의미가 있습니다. 'intptr'을 사용하거나 암시 적 변환을 제거하는 것 외에는 할 수있는 일이별로 없습니다. –
Voo
아래 답변에서 말했듯이'g ++ 4.6.3'에서 경고 메시지와 함께 작동합니다. 그래서 컴파일러에 의존하는 것 같아요. 당신의 컴파일러는 무엇입니까? – phoeagon