2014-04-04 26 views
7

Şablonları folik olarak oluşturmak istiyorum. vec1 numaralı telefondan bir öğe listesini silmek istiyorum. Ve silmek istediğim öğelerin dizinleri index_list'da saklanır.bağımlı kapsamı; önünde typename gerekir;

#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; 
} 

Ama hataların çok döndürür:

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()) 

kimse bana bu çözmeye yardımcı olabilir?

+0

hata iletisi ne gerek söyler. Bu satırlara typename anahtar sözcüğünü koyun –

+1

Bu satırların önüne 'typename 'koymayı deneyin. – ooga

+0

@ooga tamam. Harika, işe yarıyor. Bu harika. Ama hatların önüne 'typename' koymam gerektiğini söyler misin? – tqjustc

cevap

10

derleyici

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

Yani

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

arkasında nedenlerle Where and why do I have to put the "template" and "typename" keywords? bakınız yazmak gerektiğini söylüyor.

Son bir not: Eğer auto kullanabilir ve artık düşünmek gerekmez C++ 11:

auto vec1_pre = vec1.begin(); 
auto vec1_pos = vec1.begin(); 
+0

Bu satırı kullanmam gerektiğini sanmıyorum 'typename vektörü < int > :: iterator ind_pt = index_list.begin();' Bunu kaldırır mısınız? Teşekkürler! – tqjustc

+0

Tamamen doğru :) – Danvil

+0

Harika. Teşekkürler ! – tqjustc