dependent scope; need typename in front;

47,635

The compiler says

my_vector.h:21:2: error: need ‘typename’ before ‘std::vector::iterator’ because ‘std::vector’ is a dependent scope

So you need to write

typename vector< a_type >::iterator vec1_pre = vec1.begin();
typename vector< a_type >::iterator vec1_pos = vec1.begin();

See Where and why do I have to put the "template" and "typename" keywords? for the reasons behind it.

One last remark: In C++11 you can use auto and don't have to think anymore:

auto vec1_pre = vec1.begin();
auto vec1_pos = vec1.begin();
Share:
47,635

Related videos on Youtube

tqjustc
Author by

tqjustc

Updated on July 09, 2022

Comments

  • tqjustc
    tqjustc almost 2 years

    I want to create a template as follows. I want to delete a list of items from vector vec1. And the indexes of the items I want to delete are stored in index_list.

    #include <vector>
    
    using namespace std;
    
    template <typename a_type>
    bool vector_remove(vector< a_type > & vec1, vector< int > index_list)
    {
        //index_list is sorted in order from small to large.
    
        if(index_list.size() > vec1.size())
        {
            cout << "ERROR in 'vector_remove()': index_list is longer than vec1."<<endl;
            return false;
        }
        if(index_list.size() == vec1.size())
        {
            vec1.clear();
            return true;
        }
        vector< int >::iterator ind_pt = index_list.begin();
        vector< a_type >::iterator vec1_pre = vec1.begin();
        vector< a_type >::iterator vec1_pos = vec1.begin();
        int vec1_ind = 0;
        while(ind_pt != index_list.end() && vec1_pos != vec1.end())
        {
            if(*ind_pt == vec1_ind)
            {
                ind_pt ++;
                vec1_pos ++;
                vec1_ind ++;
            }
            else if( *ind_pt > vec1_ind )
            {
                *(vec1_pre) = *(vec1_pos);
                vec1_pos ++;
                vec1_pre ++;
                vec1_ind ++;
            }
            else
            {
                cout << "ERROR in 'vector_remove'." <<endl;
                return false;
            }
        }
        while(vec1_pos != vec1.end())
        {
            *(vec1_pre) = *(vec1_pos);
            vec1_pos ++;
            vec1_pre ++;
        }
        // the above codes are to put all the rejected elements to the end of the vec1.
    
        // pop back all the rejected elements.
        while(vec1_pre != vec1.end() )
        {
            vec1.pop_back();
        }
    
        return true;
    }
    

    But it returns a lot of errors:

    In file included from demo.cpp:3:0:
    my_vector.h: In function ‘bool vector_remove(std::vector<a_type>&, std::vector<int>)’:
    my_vector.h:21:2: error: need ‘typename’ before ‘std::vector<a_type>::iterator’ because ‘std::vector<a_type>’ is a dependent scope
      vector< a_type >::iterator vec1_pre = vec1.begin();
      ^
    my_vector.h:21:29: error: expected ‘;’ before ‘vec1_pre’
      vector< a_type >::iterator vec1_pre = vec1.begin();
                                 ^
    my_vector.h:22:2: error: need ‘typename’ before ‘std::vector<a_type>::iterator’ because ‘std::vector<a_type>’ is a dependent scope
      vector< a_type >::iterator vec1_pos = vec1.begin();
      ^
    my_vector.h:22:29: error: expected ‘;’ before ‘vec1_pos’
      vector< a_type >::iterator vec1_pos = vec1.begin();
                                 ^
    my_vector.h:24:38: error: ‘vec1_pos’ was not declared in this scope
      while(ind_pt != index_list.end() && vec1_pos != vec1.end())
                                          ^
    my_vector.h:34:6: error: ‘vec1_pre’ was not declared in this scope
        *(vec1_pre) = *(vec1_pos);
          ^
    my_vector.h:45:8: error: ‘vec1_pos’ was not declared in this scope
      while(vec1_pos != vec1.end())
            ^
    my_vector.h:47:5: error: ‘vec1_pre’ was not declared in this scope
       *(vec1_pre) = *(vec1_pos);
         ^
    my_vector.h:54:8: error: ‘vec1_pre’ was not declared in this scope
      while(vec1_pre != vec1.end() )
    

    could anyone help me solve this?

    • Neil Kirk
      Neil Kirk about 10 years
      The error message tells you what you need. Put the typename keyword on those lines
    • ooga
      ooga about 10 years
      Try putting typename in front of those lines.
    • tqjustc
      tqjustc about 10 years
      @ooga okay. Great, it works. it is amazing. But could you tell me when I should put 'typename' in front of the lines?
    • ooga
      ooga about 10 years
      @tqjustc, When it's a declaration that depends on a template parameter.
    • WhozCraig
      WhozCraig about 10 years
      Sure we could tell you, wait, someone already did.