2011-06-19 3 views
6

Tôi đang cố gắng nắm giữ tốt hơn về các trình lặp và các hàm chung. Tôi nghĩ rằng nó sẽ là một bài tập hữu ích để viết một hàm chuyển đổi container1 < container2 <type> > thành container3 <type>. Ví dụ: nó sẽ có thể chuyển đổi vector< deque<int> > thành list<int>.Chức năng chung để làm phẳng một hộp chứa

Tôi đã tìm tất cả quyền truy cập vùng chứa phải thông qua trình lặp, như các hàm trong <algorithm>.

Đây là mã của tôi:

#include <iterator> 
#include <algorithm> 

// COCiter == Container of Containers Iterator 
// Oiter == Output Iterator 
template <class COCiter, class Oiter> 
void flatten (COCiter start, COCiter end, Oiter dest) 
{ 
    using namespace std; 

    while (start != end) { 
     dest = copy(start->begin(), start()->end(), dest); 
     ++start; 
    } 
} 

Nhưng khi tôi cố gắng gọi nó trong đoạn mã sau:

int main() 
{ 
    using namespace std; 

    vector< vector<string> > splitlines; 
    vector<string> flat; 

    /* some code to fill SPLITLINES with vectors of strings */ 

    flatten(splitlines.begin(), splitlines.end(), back_inserter(flat)); 
} 

tôi nhận được một thông điệp mẫu lỗi khổng lồ C++, undefined reference to void flatten< ... pages of templates ...

tôi cảm thấy như mã của tôi quá dễ viết và tôi phải cần thêm một số thứ để đảm bảo rằng loại dữ liệu trong các vùng chứa bên trong khớp với kiểu dữ liệu trong vùng chứa đầu ra. Nhưng tôi không biết phải làm gì.

+0

Lưu ý rằng ngăn xếp không có trình lặp và không có chức năng bắt đầu/kết thúc. Nếu bạn muốn nó làm việc với các ngăn xếp, bạn sẽ chắc chắn phải có trường hợp đặc biệt. –

+0

Đó là sự thật; Tôi sẽ thay đổi câu hỏi. Tôi không thực sự cần compatibiliy stack; chỉ các vùng chứa có thể lặp lại. – japreiss

Trả lời

8

Tôi đã tìm thấy sự cố. Nhờ SFINAE (lỗi thay thế không phải là lỗi) trình biên dịch của bạn không thể tìm thấy mẫu chính xác vì bạn đang cố gắng gọi operator() trên start bằng cách nhập start() (có thể là lỗi đánh máy). Hãy thử điều này:

#include <iterator> 
#include <algorithm> 

// COCiter == Container of Containers Iterator 
// Oiter == Output Iterator 
template <class COCiter, class Oiter> 
void flatten (COCiter start, COCiter end, Oiter dest) { 
    while (start != end) { 
     dest = std::copy(start->begin(), start->end(), dest); 
     ++start; 
    } 
} 
+0

SFINAE không hoạt động đối với các lỗi thay thế xảy ra trong phần thân của hàm. Nó chỉ hoạt động trong chữ ký hàm (kiểu trả về và các tham số). –

+0

Tuy nhiên, công việc sửa lỗi của bạn :) –

+0

Đó thực sự là lỗi đánh máy, nhưng hóa ra tôi cũng đang mắc lỗi bao gồm nguyên mẫu hàm chung của tôi trong tệp tiêu đề. Tôi chỉ phát hiện ra bạn không thể làm điều đó; bạn phải bao gồm toàn bộ tệp cpp (tôi nghĩ). – japreiss