최근에 공유 및 약한 포인터를 작성하려고했습니다. 다음 오류 (4.5.0) GCC에서 컴파일되지 않습니다 비주얼 스튜디오를 사용하여 컴파일 코드 :C++ - GCC를 사용하여 컴파일 할 때 'operator ='와 일치하지 않습니다.
다음main.cpp: In function 'int main()':
main.cpp:18:27: error: no match for 'operator=' in 'wp1 = weak_ptr<int>(((const shared_ptr<int>&)((const shared_ptr<int>*)(& sp1))))'
weak_ptr.h:59:9: note: candidate is: void weak_ptr<T>::operator=(weak_ptr<T>&) [with T = int, weak_ptr<T> = weak_ptr<int>]
내 코드의 가장 중요한 부분입니다 :
1) 약한 포인터 구현
#include "smart_ptr_wrapper.hpp"
#include "shared_ptr.h"
template <typename T>
class weak_ptr {
private:
// Weak wrapper implementation
typedef smart_ptr_wrapper<T> weak_ptr_wrapper;
weak_ptr_wrapper* wrapper;
private:
// Shared wrapper additional routines
void increase_reference_count() {
++(wrapper->weak_count);
}
void decrease_reference_count() {
--(wrapper->weak_count);
// Dispose the wrapper if there are no more
// references to this object
// @note This should actually lock the wrapper to
// preserve thread safety
if (wrapper->strong_count == 0 && wrapper->weak_count == 0) {
delete wrapper;
}
}
public:
// Default constructor to grant syntax flexibility
weak_ptr() : wrapper(NULL) { }
weak_ptr(const shared_ptr<T>& pointer) : wrapper(pointer.wrapper) {
increase_reference_count();
}
weak_ptr(const weak_ptr& p) : wrapper(p.wrapper) {
increase_reference_count();
}
weak_ptr& operator= (weak_ptr& p) {
// Set new reference counts
// @note If this is 'just-a-pointer', which was created
// using default constructor then our wrapper would be 'NULL'
if (wrapper != NULL) {
decrease_reference_count();
}
p.increase_reference_count();
// Set new wrapper
wrapper = p.wrapper;
return *this;
}
~weak_ptr() {
decrease_reference_count();
}
T* get() const { return (wrapper->strong_count == 0) ? NULL: wrapper->raw_pointer; }
T* operator->() const { return get(); }
T& operator* () const { return *get(); }
// User comparison operation
operator void*() const {
return (get() == NULL);
}
};
2) MAIN.CPP
int main() {
shared_ptr<int> sp1(new int(4));
weak_ptr<int> wp1(sp1);
// Next line can't be compiled by gcc... Why?
wp1 = weak_ptr<int>(sp1);
return 0;
}
,536,913 (
operator=
선언 참고)
Q :
왜 이런 일이 발생합니까? 나는 어리석은 짓 일지 모르지만이 코드가 무엇이 잘못된 것인지 알 수 없으며 GCC 동작을 알 수 없게 될 수도 없다. 누군가가이 코드를 컴파일하는 이유와 왜 MSVS에서 작동하는지 설명 할 수 있다면 감사 할 것입니다. (한 가지 컴파일러가 왜 괜찮습니까? 왜 두 번째 컴파일러가 실패할까요?) 고맙습니다.
업데이트 : 전체 코드와 컴파일러 오류가 여기에 볼 수 있습니다 - http://codepad.org/MirlNayf
GCC (http://codepad.org/GUdC3D0L)에서 작동 –
이전 컴파일러 확장으로 인해 MSVC++에서 작동합니다. 확장 기능을 해제하면 MSVC에서도 오류가 발생합니다. – AnT