Từ 1 tới 6 trên tổng số 6 kết quả

Đề tài: Làm sao để truyền 1 iterator cho hàm?

  1. #1
    Ngày gia nhập
    08 2010
    Bài viết
    30

    Mặc định Làm sao để truyền 1 iterator cho hàm?

    Minh cần viết 1 hàm để xử lí 1 container là vector< T >, trong đó cần truyền 1 tham số là một iterator nhưng ko biết truyền thế nào?!?
    Mình đã thử:
    Code:
     template < typename T > void f (vector< T > &, std::iterator < T >)
    nhưng trình biên dịch nó bảo là còn quá ít thông tin cho template của iterator (tất nhiên ở đây mình chỉ cần tạo 1 iterator kiểu T và cấp random access)

  2. #2
    Ngày gia nhập
    07 2011
    Bài viết
    160

    Trích dẫn Nguyên bản được gửi bởi Fredy Xem bài viết
    Minh cần viết 1 hàm để xử lí 1 container là vector< T >, trong đó cần truyền 1 tham số là một iterator nhưng ko biết truyền thế nào?!?
    Mình đã thử:
    Code:
     template < typename T > void f (vector< T > &, std::iterator < T >)
    nhưng trình biên dịch nó bảo là còn quá ít thông tin cho template của iterator (tất nhiên ở đây mình chỉ cần tạo 1 iterator kiểu T và cấp random access)
    Ở mức đơn giản nhất, bạn chỉ cần
    C++ Code:
    1.  template < class T, class Iter > void f (vector< T > &, Iter iter);

    Nếu bạn thực sự cần khống chế tốt hơn về kiểu dữ liệu truyền vào (ví dụ iter phải là random access iterator chẳng hạn) thì bạn tham khảo thêm boost::type_traits và boost::enable_if của bộ thư viện boost nhé. Nhưng theo mình nghĩ thì đại đa số trường hợp dùng cách đơn giản như trên là được rồi (STL hầu hết cũng dùng như vậy)

    Còn trường hợp iterator truyền vào luôn là iter của vector<T> thì viết:
    C++ Code:
    1.  template < class T> void f (vector< T > &, typename vector<T>::iterator iter);
    Đã được chỉnh sửa lần cuối bởi fbchicken : 28-07-2011 lúc 09:08 PM. Lý do: Thiếu chữ typename - sửa lại cho đúng ;))

  3. #3
    Ngày gia nhập
    08 2010
    Bài viết
    30

    Trích dẫn Nguyên bản được gửi bởi fbchicken Xem bài viết
    Ở mức đơn giản nhất, bạn chỉ cần
    C++ Code:
    1.  template < class T, class Iter > void f (vector< T > &, Iter iter);

    Nếu bạn thực sự cần khống chế tốt hơn về kiểu dữ liệu truyền vào (ví dụ iter phải là random access iterator chẳng hạn) thì bạn tham khảo thêm boost::type_traits và boost::enable_if của bộ thư viện boost nhé. Nhưng theo mình nghĩ thì đại đa số trường hợp dùng cách đơn giản như trên là được rồi (STL hầu hết cũng dùng như vậy)

    Còn trường hợp iterator truyền vào luôn là iter của vector<T> thì viết:
    C++ Code:
    1.  template < class T> void f (vector< T > &, vector<T>::iterator iter);
    Hix, mình cũng từng làm giống cách cuối của bạn nhưng bị báo lỗi!!! VS10 nó báo 1 error và 1 warning. error nó chỉ báo có lỗi cú pháp ở "biến" iterator!! còn warning nó để là 'std::vector<T>::iterator' : dependent name is not a type

  4. #4
    Ngày gia nhập
    07 2011
    Bài viết
    160

    Oh mình xin lỗi, quên mất ko để ý, vì nó phụ thuộc vào tham số template T nên phải viết
    C++ Code:
    1.  template < class T> void f (vector< T > &, typename vector<T>::iterator iter);

  5. #5
    Ngày gia nhập
    08 2010
    Bài viết
    30

    Trích dẫn Nguyên bản được gửi bởi fbchicken Xem bài viết
    Oh mình xin lỗi, quên mất ko để ý, vì nó phụ thuộc vào tham số template T nên phải viết
    C++ Code:
    1.  template < class T> void f (vector< T > &, typename vector<T>::iterator iter);
    Oh, cám ơn bạn rất nhìu . Nhưng có thể giải thích lun cho mình là giữa có và không có từ typename khác nhau ntn hay ko???

  6. #6
    Ngày gia nhập
    07 2011
    Bài viết
    160

    Mặc định Làm sao để truyền 1 iterator cho hàm?

    Trích dẫn Nguyên bản được gửi bởi Fredy Xem bài viết
    Oh, cám ơn bạn rất nhìu . Nhưng có thể giải thích lun cho mình là giữa có và không có từ typename khác nhau ntn hay ko???
    Vì function f phụ thuộc vào tham số T, mà lúc compile đoạn code đó compiler không biết T là cái gì
    ==> Nên cũng không thể hiểu được vector<T> là cái gì
    ==> Không biết vector<T>::iterator là cái gì? Kiểu dữ liệu, tên biến hay tên constant

    Khi có typename vector<T>::iterator thì compiler sẽ biết vector<T>::iterator là 1 data-type (kiểu dữ liệu).

    Vì vậy C++ standard yêu cầu khi khai báo 1 data-type liên quan đến 1 template parameter thì phải có chữ typename. Chuẩn yêu cầu vậy thì mình cứ làm vậy thôi Còn khi vector<T>::xxx với xxx là tên biến (static), tên hàm (static), tên constant.. thì không cần và không được ghi typename đằng trước

    1 số compiler (ví dụ bcc của borland) chỉ compile phần code liên quan đến template khi nó được instantiate, và vì vậy dễ dãi hơn rất nhiều cái code thiếu typename kia cũng được chấp nhận. Nhưng sai thì vẫn là sai mình làm thì làm theo yêu cầu của chuẩn C++ thôi

Các đề tài tương tự

  1. Mã nguồn C Lỗi Lỗi see reference to class template instantiation 'std::list<_Ty>' being khi sử dụng Iterator cho class tự xây dựng
    Gửi bởi Mr_Chan trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 4
    Bài viết cuối: 10-07-2013, 01:58 AM
  2. Chương 8: Mẫu Iterator và Composite - Series bài dịch Design Pattern for Dummies
    Gửi bởi ali33C trong diễn đàn Tutorials và Thủ thuật lập trình Java
    Trả lời: 4
    Bài viết cuối: 02-03-2012, 10:16 AM
  3. Lập trình C++ kiểu trả về của string::iterator và tham số của algorithm::find()
    Gửi bởi kukopuka trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 13
    Bài viết cuối: 08-05-2011, 04:45 PM
  4. Sự khác nhau giữa iterator và const_iterator
    Gửi bởi mp121209 trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 15
    Bài viết cuối: 23-04-2011, 06:43 PM
  5. vector<int>::iterator it; có nghĩa gì?
    Gửi bởi haian trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 8
    Bài viết cuối: 24-12-2008, 05:51 AM

Quyền hạn của bạn

  • Bạn không thể gửi đề tài mới
  • Bạn không thể gửi bài trả lời
  • Bạn không thể gửi các đính kèm
  • Bạn không thể chỉnh sửa bài viết của bạn