На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Модераторы: Qraizer, Hsilgos
  
> ошибка компиляции
    есть след код, но не компилируется в чем проблема? :wacko:
    ExpandedWrap disabled
      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); }
    Сообщение отредактировано: Cfon -
      Так вроде же все очевидно? Компилятор в этот момент ничего не знает о VectorStrPtr, который будет полностью объявлен позже.
      Унесите определение этой функции вниз, после определения VectorStrPtr.
        Цитата Dushevny @
        Так вроде же все очевидно? Компилятор в этот момент ничего не знает о VectorStrPtr, который будет полностью объявлен позже.
        Унесите определение этой функции вниз, после определения VectorStrPtr.

        если вниз перенести то идёт обратная ошибка: error: 'class VectorStr' is incomplete

        Добавлено
        точнее: error: invalid use of incomplete type 'class VectorStr'
          Кривая архитектура классов.

          Добавлено
          Как вариант (безе переделывания архитектуры):
          ExpandedWrap disabled
            #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)
            {
                
            }
            Цитата shm @
            Кривая архитектура классов.

            Как вариант (безе переделывания архитектуры):

            спс коллега :D
            вот теперь все пучком! :yes:

            а в чем кривая?
              Цитата Cfon @
              а в чем кривая?

              Классы сильно связаны.
                это я переживу, как и старина Стэн Липман :D
                  Цитата Cfon @
                  если вниз перенести то идёт обратная ошибка: error: 'class VectorStr' is incomplete
                  Так не весь класс VectorStr переностите, а только определение функции-члена:

                  ExpandedWrap disabled
                    inline VectorStrPtr VectorStr::begin() { return VectorStrPtr(*this); }

                  Добавлено: или как shm предложил, но он inline забыл.
                  Сообщение отредактировано: Dushevny -
                    Я ничего не забыл, но предполагал, что ТС заюзает раздельную компиляцию.
                      Цитата Dushevny @
                      Так не весь класс VectorStr переностите, а только определение функции-члена:

                      ExpandedWrap disabled
                        inline VectorStrPtr VectorStr::begin() { return VectorStrPtr(*this); }

                      о пардон моя не внимательность :yes:
                      0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                      0 пользователей:


                      Рейтинг@Mail.ru
                      [ Script execution time: 0,0386 ]   [ 17 queries used ]   [ Generated: 25.04.24, 16:30 GMT ]