Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

dependent scope; need typename in front;

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?

like image 954
tqjustc Avatar asked Apr 04 '14 23:04

tqjustc


People also ask

What is a dependent scope?

[See CDI spec] Good news: the dependent scope is the default scope, if no scope is defined (if a class is not annotated). Following the "Convention over Configuration" principle, you don't have to declare the @Dependent annotation. All not annotated classes, or "POJOs", are dependent-scoped.

Is a dependent scope template?

Dependent type are data types which depend on the template parameter. These dependent types are accessed via scope resolution operator. template<typename T> class MFPointer { public: typedef T* ptype; };

Why do we use Typename in C++?

" typename " is a keyword in the C++ programming language used when writing templates. It is used for specifying that a dependent name in a template definition or declaration is a type.

What is Typename C++?

Use the keyword typename if you have a qualified name that refers to a type and depends on a template parameter. Only use the keyword typename in template declarations and definitions.


1 Answers

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(); 
like image 145
Danvil Avatar answered Sep 20 '22 21:09

Danvil