Как объявить итераторы для объекта производного класса? - PullRequest
1 голос
/ 16 февраля 2012

Правильно ли я объявляю итераторы производного класса r_iter и c_iter?Внутри производного класса r_iter является итератором двумерного вектора, а c_iter является итератором двумерного вектора.

Я получаю следующую ошибку, и я был бы очень признателен, если бы кто-нибудь сказал мне, где я ошибаюсь

add_round_key.cpp:26:34: error: expected class-name before ‘{’ token
add_round_key.cpp:27:2: error: ‘dVector’ is not a template
add_round_key.cpp:27:11: error: ‘dVector’ is not a template
add_round_key.cpp:27:28: error: invalid use of ‘::’
add_round_key.cpp: In member function ‘void dVector::RotWord()’:
add_round_key.cpp:37:2: error: ‘r_iter’ was not declared in this scope
add_round_key.cpp:37:17: error: ‘class dVector’ has no member named ‘begin’
add_round_key.cpp:38:2: error: ‘c_iter’ was not declared in this scope





line# 26    class dVector:public std::vector {
line# 27             dVector <dVector <int> >::iterator r_iter;
                     dVector <int>::iterator c_iter;

                      public:
                      void RotWord();
                        void SubWord();
              };

            void dVector::RotWord() {
                  int temp ;
line# 37          r_iter = this->begin(); 
     #38          c_iter = (*r_iter).end();
                 *(c_iter) = *(c_iter+4);
               *(c_iter+4) = *(c_iter+8);
            }


          void dVector::SubWord(){
              //function definition
        }

    int main (int argc, char *argv[]) 
    {

        /*wordArray is a 4x4 word array stored in column-order form*/
        dVector <dVector <int> > wordArray(4,dVector<int>(40,0));
        dVector <dVector <int> >::iterator ckIter,i ,j, row_iter;
        dVector <int>::iterator ii,jj, col_iter;
        wordArray.RotWord();
        wordArray.Subword();
    }

Ответы [ 2 ]

2 голосов
/ 16 февраля 2012

Строка 26: std::vector - это шаблон, который вам нужно указать, на чем специализироваться, чтобы сделать его классом, который вы можете наследовать.

Бонус по строке 26: избегайте наследования от стандартных контейнеров

Строка 27: dVector шаблон? Если это не так, вы не можете использовать его, как если бы он был!

Строки 37-38: ошибки в строках 27 и 28 приводят к тому, что r_iter и c_iter не объявляются, поэтому вы получаете ошибки в этих строках.

Тем не менее, это может помочь вам выполнить то, что вы пытаетесь сделать:

template<class T>
class dVector : public std::vector<T> {
   typename dVector <dVector <T> >::iterator r_iter;
   typename dVector <T>::iterator c_iter;

Но совет все еще остается, не наследовать от стандартных контейнеров .

0 голосов
/ 16 февраля 2012

Я думаю, что вы забыли назначить тип шаблона для std::vector перед его наследованием.

class dVector:public std::vector {        // Not valid

class dVector:public std::vector<int> {   // Valid
...