typedef std::auto_ptr<CGRecordset> CGRecordsetPtr;
//...class CAppDBFactory
{
// ...public:
CGRecordsetPtr CreatePreparedRecordset(const std::string&);
// ...
};
//...
CAppDBFactory Factory;
// Вот так все замечательно, компилятор не ругается
// CGRecordsetPtr pRecordset = Factory.CreatePreparedRecordset(sSQLText);
// а если делать так,
CGRecordsetPtr pRecordset;
pRecordset = Factory.CreatePreparedRecordset(sSQLText);
// то компилятор ругается
// Could not find a match for 'CGRecordsetPtr::operator =(CGRecordsetPtr)'
Действительно, такого определения в auto_ptr нет и быть не может, у = в качестве аргумента ссылка на CGRecordsetPtr.
Так вот я не пойму, почему при инициалицации копирующий конструктор срабатывает, а оператор = нет?
Здравствуйте, Lenikur, Вы писали:
L>Так вот я не пойму, почему при инициалицации копирующий конструктор срабатывает, а оператор = нет?
ну так должно же что-то одно срабатывать: либо оператор=, либо конструктор копирования, потому что зачем выполнять одну и ту же работу дважды?
Ну а так как при инициализации мы должны инициализировать всякие базы, константы и ссылки (если они имеются), а такое позволено делать только конструктору копирования, то срабатывает он.
А оператору= остается уже работать только на сконструированных объектах.
Хотя общую часть инициализации, не затрагивающую константы, ссылки и базовые подобъекты, можно держать в operator=, а в конструкторе копирования звать его явно: this->operator=(rhs);
Спасибо за ответ
L>>Так вот я не пойму, почему при инициалицации копирующий конструктор срабатывает, а оператор = нет? J>ну так должно же что-то одно срабатывать: либо оператор=, либо конструктор копирования, потому что зачем выполнять одну и ту же работу дважды?
Это понятно
Я наверное не правильно выразился, я не пойму почему инициализация компиляется, а присваивание нет.
Здравствуйте, Lenikur, Вы писали:
L>Так вот я не пойму, почему при инициалицации копирующий конструктор срабатывает, а оператор = нет?
Какой компилятор?
Дело в том, что конструктор от "обычного" указателя в auto_ptr объявлен как explicit. Поэтому оба варианта не должны компилироваться.
Здравствуйте, Bell, Вы писали:
B>Какой компилятор?
Это написано в C++ Builder 5.0 B>Дело в том, что конструктор от "обычного" указателя в auto_ptr объявлен как explicit. Поэтому оба варианта не должны компилироваться.
копирующий конструктор не объявлен как explicit.
Вот объявления:
L>auto_ptr(const auto_ptr<T>& rhs) throw(); L>auto_ptr<T>& operator=(const auto_ptr<T>& rhs) throw();
L>мне так кажется, что оба варианта должны компилироваться
мне тоже и моему VC71 тоже
Здравствуйте, Lenikur, Вы писали:
L>Елки.. неужели опять долбанный Borland! или все-таки я?
Скорее первое
Вот тебе пример, который компилится VC6 и Comeau:
ЗЫ
Кстати приведенные тобой раньше сигнатуры конструктора копии и оператора присваивания не соответствуют стандарту — аргумент должен передаваться по неконстантной ссылке...
L>>Елки.. неужели опять долбанный Borland! или все-таки я? B>Скорее первое
Боюсь что это я чего-то не вижу..
B>ЗЫ B>Кстати приведенные тобой раньше сигнатуры конструктора копии и оператора присваивания не соответствуют стандарту — аргумент должен передаваться по неконстантной ссылке...
Кстати, посмотри в memory, там именно как я написал. Прикольная реализация
Здравствуйте, Lenikur, Вы писали:
L>А попробуй компильнуть это:
...
vc6, comeau — без проблем.
B>>ЗЫ B>>Кстати приведенные тобой раньше сигнатуры конструктора копии и оператора присваивания не соответствуют стандарту — аргумент должен передаваться по неконстантной ссылке...
L>Кстати, посмотри в memory, там именно как я написал. Прикольная реализация
ну и что?
Здравствуйте, Bell, Вы писали:
B>Здравствуйте, Lenikur, Вы писали:
B>vc6, comeau — без проблем.
И правда без проблем, НЕНАВИЖУ BORLAND!! два дня копал!
L>>Кстати, посмотри в memory, там именно как я написал. Прикольная реализация B>ну и что?
Вот что:
Lenikur wrote:
> L>>Кстати, посмотри в memory, там именно как я написал. Прикольная реализация > B>ну и что? > Вот что:
Ничего прикольного — это убогая, не соответствующая стандарту реализация от MS VC++ 6. Несоответствуящая потому, что отсутствует ф-ция reset, убогая потому, что им пришлось добавить в класс флаг _Owns, который, будь auto_ptr<> реализован по стандарту, не был бы нужен.
Здравствуйте, Lenikur, Вы писали:
L>Вот что:
...
Что-то я не понял: это же реализация из VC6? Она, конечно не является образцом для подражания, но твой исходный пример с этой реализацией работает
Здравствуйте, Bell, Вы писали:
B>Здравствуйте, Lenikur, Вы писали:
L>>Вот что: B>... B>Что-то я не понял: это же реализация из VC6? Она, конечно не является образцом для подражания, но твой исходный пример с этой реализацией работает
Да все работает, просто я привел этот код, в ответ на твое замечание:
B>>Кстати приведенные тобой раньше сигнатуры конструктора копии и оператора присваивания не соответствуют стандарту — аргумент должен передаваться по неконстантной ссылке...
я и сам был удивлен увидев const.
Спасибо за помощь, Bell. Предлагаю закрыть эту тему. Кстати, попробовал на 6 C++ Builder, все работает.