2014-04-04 12 views
7

Tôi muốn tạo mẫu làm folows. Tôi muốn xóa danh sách các mục từ vector vec1. Và các chỉ mục của các mục tôi muốn xóa được lưu trữ trong index_list.phạm vi phụ thuộc; cần gõ tên trước;

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

Nhưng nó sẽ trả về rất nhiều lỗi:

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

bất cứ ai có thể giúp tôi giải quyết việc này?

+0

Các lỗi cho bạn biết những gì bạn cần. Đặt từ khóa tên tệp trên các dòng –

+1

Thử đặt 'typename' trước các dòng đó. – ooga

+0

@ooga được rồi. Tuyệt vời, nó hoạt động. thật là kinh ngạc. Nhưng bạn có thể cho tôi biết khi nào tôi nên đặt 'typename' trước các dòng? – tqjustc

Trả lời

10

Trình biên dịch nói

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

Vì vậy, bạn cần phải viết

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

Xem Where and why do I have to put the "template" and "typename" keywords? vì những lý do đằng sau nó.

Một nhận xét cuối cùng: Trong C++ 11 bạn có thể sử dụng auto và không phải suy nghĩ nữa:

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

Tôi không nghĩ rằng mình cần dòng này 'typename vector < int > :: iterator ind_pt = index_list.begin();' Bạn có thể xóa nó không? Cảm ơn! – tqjustc

+0

Hoàn toàn đúng :) – Danvil

+0

Tuyệt vời. Cảm ơn ! – tqjustc

Các vấn đề liên quan