C++ – нет совпадения для 'operator=' при компиляции с использованием GCCC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 C++ – нет совпадения для 'operator=' при компиляции с использованием GCC

Сообщение Anonymous »

Недавно я попробовал создать свои собственные общие и слабые указатели. Код, который компилируется с помощью Visual Studio, не компилируется в GCC (4.5.0) со следующей ошибкой:

Код: Выделить всё

main.cpp: In function 'int main()':
main.cpp:18:27: error: no match for 'operator=' in 'wp1 = weak_ptr(((const shared_ptr&)((const shared_ptr*)(& sp1))))'
weak_ptr.h:59:9: note: candidate is: void weak_ptr::operator=(weak_ptr&) [with T = int, weak_ptr = weak_ptr]
Вот наиболее важные части моего кода:

1) Слабый реализация указателя (обратите внимание на объявление оператора=)

Код: Выделить всё

#include "smart_ptr_wrapper.hpp"
#include "shared_ptr.h"

template 
class weak_ptr {
private:
// Weak wrapper implementation
typedef smart_ptr_wrapper 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& 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 sp1(new int(4));
weak_ptr wp1(sp1);
// Next line can't be compiled by gcc... Why?
wp1 = weak_ptr(sp1);
return 0;
}
Вопрос:

Почему это происходит? Я, вероятно, просто глуп, но я не понимаю, что не так с этим кодом, и не могу понять поведение GCC. Я также был бы признателен, если бы кто-нибудь объяснил, почему этот код компилируется и почему он работает под MSVS (я имею в виду, почему один компилятор делает это нормально и почему второй не работает). Спасибо.

Обновление: полный код и ошибки компилятора можно увидеть здесь — http://codepad.org/MirlNayf

Подробнее здесь: https://stackoverflow.com/questions/287 ... -using-gcc
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»