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

Đề tài: Lỗi"error C2275: 'T' : illegal use of this type as an expression" khi dùng "list<T>::iterator it"

  1. #1
    Ngày gia nhập
    04 2010
    Nơi ở
    Binh Thanh, Hồ Chí Minh, Vietnam, Vietnam
    Bài viết
    504

    Mặc định Lỗi"error C2275: 'T' : illegal use of this type as an expression" khi dùng "list<T>::iterator it"

    Mấy bác xem code rồi cho em ý kiến để chỉnh sửa. Mới dùng template lần đầu nên còn nhiều thứ chưa biết.
    C++ Code:
    1. #include <tchar.h>
    2. #include <iostream>
    3. #include <list>
    4. using namespace std;
    5. template <class T, class U> class Finder
    6. {
    7. public:
    8.     typedef int (*CompFunc) (const T&, const U&);
    9.     Finder(const list<T> &list, CompFunc func)
    10.     {
    11.         this->list = &list;
    12.         this->compare = func;
    13.     }
    14.     typename list<T>::iterator& Find(const U &Value)
    15.     {
    16.         typename list<T>::iterator it; //error C2275: 'T' : illegal use of this type as an expression
    17.         for (it = list->begin() ; it != list->end(); it++ )
    18.         {
    19.             if(compare(*it, Value))
    20.                 return it;
    21.         }
    22.         return NULL;
    23.     }
    24. private:
    25.     CompFunc compare;
    26.     const list<T> *list;
    27. };
    28. int Fa( int const &a,int const &b)
    29. {
    30.     return (a == b);
    31. }
    32.  
    33. int _tmain(int argc, _TCHAR* argv[])
    34. {
    35.     int aa = int(1111);
    36.     int bb = int(2222);
    37.     int cc = int(3333);
    38.     int ee = int(4444);
    39.  
    40.     list<int> a;
    41.     list<int> b;
    42.  
    43.     a.insert(a.end(),aa);
    44.     a.insert(a.end(),bb);
    45.  
    46.     b.insert(b.end(),cc);
    47.     b.merge(a);
    48.  
    49.     Finder<int,int> finder(b, Fa);
    50.  
    51.     list<int>::iterator abaa = finder.Find(3333);
    52.  
    53.     cout<<*abaa;
    54.  
    55.     cin.get();
    56.     return 0;
    57. }
    Đã được chỉnh sửa lần cuối bởi doicanhden : 18-01-2012 lúc 10:14 PM. Lý do: Bổ sung đầy đủ code.
    Kết bạn với tôi <3
    Skype: giautm
    Facebook:
    https://fb.com/giautm.duongntt
    Email:
    giau.tmg@gmail.com

  2. #2
    Ngày gia nhập
    11 2010
    Bài viết
    589

    bạn thêm từ khoá typename trước list<T>::iterator it
    Code:
    typename list<T>::iterator it
    Nguyên nhân của việc này là do khi trình dịch đọc đến đoạn này thì kiểu list<T> là chưa xác định, do đó nó không phân biệt được list<T>::iterator là một kiểu hay là một thành phần tĩnh (static). Theo chuẩn thì mặc định list<T>::iterator được coi là một thành phần tĩnh, nên list<T>::iterator it gây ra lỗi. Để chỉ ra nó là một kiểu thì phải thêm từ khoá typename trước đó.

  3. #3
    Ngày gia nhập
    04 2010
    Nơi ở
    Binh Thanh, Hồ Chí Minh, Vietnam, Vietnam
    Bài viết
    504

    Vẫn bị lỗi như vậy bạn à. Mình đã dùng typename nhưng vẫn lỗi.
    Full-Error:
    Code:
    1>c:\users\doicanhden\desktop\new folder (2)\template list\template list\template list.cpp(21): error C2275: 'T' : illegal use of this type as an expression
    1>          c:\users\doicanhden\desktop\new folder (2)\template list\template list\template list.cpp(53) : see declaration of 'T'
    1>          c:\users\doicanhden\desktop\new folder (2)\template list\template list\template list.cpp(20) : while compiling class template member function 'std::_List_iterator<_Mylist> &Finder<T,U>::Find(const U &)'
    1>          with
    1>          [
    1>              _Mylist=std::_List_val<int,std::allocator<int>>,
    1>              T=int,
    1>              U=int
    1>          ]
    1>          c:\users\doicanhden\desktop\new folder (2)\template list\template list\template list.cpp(53) : see reference to class template instantiation 'Finder<T,U>' being compiled
    1>          with
    1>          [
    1>              T=int,
    1>              U=int
    1>          ]
    Kết bạn với tôi <3
    Skype: giautm
    Facebook:
    https://fb.com/giautm.duongntt
    Email:
    giau.tmg@gmail.com

  4. #4
    Ngày gia nhập
    11 2010
    Bài viết
    589

    Vừa xem lại, code của bạn có 1 số vấn đề sau:
    - member list của lớp Finder trùng tên với stl list. Sửa bằng cách đổi tên thành lst chẳng hạn. Nhưng tốt nhất là bỏ cái using namespace std và sau đó thêm std:: vào mỗi lớp của stl
    - thành phần list của Finder là const, nên iterator của nó là const_iterator chứ ko phải iteratoo
    C++ Code:
    1. typename std::list<T>::const_iterator it;
    - Nếu không tìm được thì trả về NULL, trong khi kiểu quy định là một const_iterator. Nên sửa lại thành
    C++ Code:
    1. return lst->end();
    - it trong hàm Find là local variable, nó sẽ bị hủy sau khi thoát ra khỏi hàm. Mà hàm của bạn lại trả về reference của nó => vô dụng.
    Phải sửa phần khai báo thành:
    C++ Code:
    1. typename std::list<T>::const_iterator Find(const U& Value)

    Còn một chỗ nữa, không phải lỗi nhưng mà không nên viết thế: Đó là bạn dùng function pointer để so sánh. Function pointer có nhược điểm là không thể inline được, mỗi lần cần so sánh là một lần gọi hàm => chạy chậm. Cách làm được khuyến cáo là dùng Function object hoặc operator==, mấy cái này có thể inline được.
    Với operator==, hàm Find có thể sửa thành:
    C++ Code:
    1. ...
    2. if(*it == Value)
    3.     return it,
    4. ...
    Trước đó phải định nghĩa operator== cho kiểu U và V.
    Hoặc function object:
    C++ Code:
    1. template <class U, class T>
    2. struct FinderCompare;
    3. // các specialization cho các U,V sẽ được định nghĩa sau.
    Lớp Finder viết lại:
    C++ Code:
    1. template<class T, class U, class CompFunc = FinderCompare<T,U> >
    2. class Finder {
    3. ...
    4. };
    Đã được chỉnh sửa lần cuối bởi boss14420 : 18-01-2012 lúc 11:52 PM.

  5. #5
    Ngày gia nhập
    04 2010
    Nơi ở
    Binh Thanh, Hồ Chí Minh, Vietnam, Vietnam
    Bài viết
    504

    Cám ơn bác nhiều lắm. Một bài giúp đỡ hoàn chỉnh. :x. Lúc code không để ý, ban đầu cái member tên là "List" sửa tới lui 1 hồi sao thành "list" mà quên mất. . Còn phần template và STL thì em không rành cho lắm. Vì dùng chủ yếu là C. Cái function pointer em nghĩ là dùng tốt hơn, nhưng chưa nghĩ là dùng function object cho nó luôn. Thanks bác chuyện Return nữa. Em viết xong mà thấy kì kì.
    Đã được chỉnh sửa lần cuối bởi doicanhden : 19-01-2012 lúc 01:12 AM.
    Kết bạn với tôi <3
    Skype: giautm
    Facebook:
    https://fb.com/giautm.duongntt
    Email:
    giau.tmg@gmail.com

  6. #6
    Ngày gia nhập
    04 2010
    Nơi ở
    Binh Thanh, Hồ Chí Minh, Vietnam, Vietnam
    Bài viết
    504

    Mặc định Lỗi"error C2275: 'T' : illegal use of this type as an expression" khi dùng "list<T>::iterator it"

    Hự! Viết xong, vào đọc lại sách về STL thì thấy dùng functor và find_if có lẽ đơn giản hơn. @@!
    Kết bạn với tôi <3
    Skype: giautm
    Facebook:
    https://fb.com/giautm.duongntt
    Email:
    giau.tmg@gmail.com

  7. #7
    Ngày gia nhập
    11 2010
    Bài viết
    589

    ^
    Chính xác là vậy. Quan trọng là tập viết cho quen với template, sau này còn nhiều cái lằng nhằng nữa.

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

  1. Cách sửa lỗi "An expression of non-boolean type specified in a context where a condition is expected, near 'ORDER'."
    Gửi bởi hoadoquyen2710 trong diễn đàn Thắc mắc lập trình ASP.NET
    Trả lời: 2
    Bài viết cuối: 29-06-2013, 12:08 AM
  2. Sự khác nhau giữa input type="text" và input type="submit" và type ="button"
    Gửi bởi tuanngocpt trong diễn đàn Thắc mắc lập trình ASP.NET
    Trả lời: 2
    Bài viết cuối: 04-04-2012, 12:55 AM
  3. Lập trình C++ Lỗi "error C2017: illegal escape sequence" trong C++, xử lý thế nào?
    Gửi bởi nlhuykhang trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 3
    Bài viết cuối: 03-12-2011, 03:20 AM
  4. Trả lời: 1
    Bài viết cuối: 01-12-2011, 07:32 PM
  5. Bài tập C lỗi "syntax error" trong file định dạng lại kiểu dữ liệu "types.h"
    Gửi bởi grandthorn trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 10
    Bài viết cuối: 10-09-2011, 07:29 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