Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.145.152.98] |
|
Сообщ.
#1
,
|
|
|
есть след код, но не компилируется в чем проблема?
class VectorStrPtr; class VectorStr { typedef std::vector<std::string> vecstr_t; friend class VectorStrPtr; std::shared_ptr<vecstr_t> sp_; public: VectorStr() : sp_(std::make_shared<vecstr_t>()) {} VectorStrPtr begin() { return VectorStrPtr(*this); } //<--- тут ошибка компиляции //VectorStrPtr end() { return VectorStrPtr(*this, sp_->size()); } }; class VectorStrPtr { typedef std::vector<std::string> vecstr_t; public: VectorStrPtr() {} VectorStrPtr(VectorStr& vec, size_t i=0) : wp_(vec.sp_), idx_(i) {} private: std::weak_ptr<vecstr_t> wp_; size_t idx_; }; ошибка след: error: return type 'class VectorStrPtr' is incomplete VectorStrPtr begin() { return VectorStrPtr(*this); } |
Сообщ.
#2
,
|
|
|
Так вроде же все очевидно? Компилятор в этот момент ничего не знает о VectorStrPtr, который будет полностью объявлен позже.
Унесите определение этой функции вниз, после определения VectorStrPtr. |
Сообщ.
#3
,
|
|
|
Цитата Dushevny @ Так вроде же все очевидно? Компилятор в этот момент ничего не знает о VectorStrPtr, который будет полностью объявлен позже. Унесите определение этой функции вниз, после определения VectorStrPtr. если вниз перенести то идёт обратная ошибка: error: 'class VectorStr' is incomplete Добавлено точнее: error: invalid use of incomplete type 'class VectorStr' |
Сообщ.
#4
,
|
|
|
Кривая архитектура классов.
Добавлено Как вариант (безе переделывания архитектуры): #include <vector> #include <string> #include <memory> class VectorStr; class VectorStrPtr { typedef std::vector<std::string> vecstr_t; public: VectorStrPtr() {} VectorStrPtr(VectorStr& vec, size_t i=0); private: std::weak_ptr<vecstr_t> wp_; size_t idx_; }; class VectorStr { typedef std::vector<std::string> vecstr_t; friend class VectorStrPtr; std::shared_ptr<vecstr_t> sp_; public: VectorStr() : sp_(std::make_shared<vecstr_t>()) {} VectorStrPtr begin() { return VectorStrPtr(*this); } //<--- тут ошибка компиляции //VectorStrPtr end() { return VectorStrPtr(*this, sp_->size()); } }; VectorStrPtr::VectorStrPtr(VectorStr& vec, size_t i) : wp_(vec.sp_), idx_(i) { } |
Сообщ.
#5
,
|
|
|
Цитата shm @ Кривая архитектура классов. Как вариант (безе переделывания архитектуры): спс коллега вот теперь все пучком! а в чем кривая? |
Сообщ.
#6
,
|
|
|
Цитата Cfon @ а в чем кривая? Классы сильно связаны. |
Сообщ.
#7
,
|
|
|
это я переживу, как и старина Стэн Липман
|
Сообщ.
#8
,
|
|
|
Цитата Cfon @ Так не весь класс VectorStr переностите, а только определение функции-члена:если вниз перенести то идёт обратная ошибка: error: 'class VectorStr' is incomplete inline VectorStrPtr VectorStr::begin() { return VectorStrPtr(*this); } Добавлено: или как shm предложил, но он inline забыл. |
Сообщ.
#9
,
|
|
|
Я ничего не забыл, но предполагал, что ТС заюзает раздельную компиляцию.
|
Сообщ.
#10
,
|
|
|
Цитата Dushevny @ Так не весь класс VectorStr переностите, а только определение функции-члена: inline VectorStrPtr VectorStr::begin() { return VectorStrPtr(*this); } о пардон моя не внимательность |