User Tag List

+ Trả lời chủ đề
Hiện kết quả từ 1 tới 6 của 6

Chủ đề: Gặp lỗi với con trỏ hàm trong C++

  1. #1
    .:: Grumpy svBKer ::. Avatar của 1973
    Tham gia ngày
    Mar 2010
    Bài gửi
    3.793

    Mặc định Gặp lỗi với con trỏ hàm trong C++

    Mình đang thử test 1 đoạn chương trình minh họa con trỏ hàm trong C++ như sau nhưng khi biên dịch thì gặp lỗi:

    PHP Code:
    /* Vi du ve con tro ham */
    #include <iostream>
    using namespace std;

    int add(int aint b);
    int minus(int aint b);
    int operation(int aint bint (*function)(intint));

    int main() {
        
    int a 25;
        
    int (* func)(intint);
        
    func = &minus;
        
    cout << operation(ab, &add) <<endl;
        
    cout << operation(abfunc);
        return 
    0;
    }

    int add(int aint b) {
        return 
    a+b;
    }

    int minus(int aint b) {
        return 
    a-b;
    }

    int operation(int aint bint (*function)(intint)) {
        return function(
    ab); 
    Lỗi xảy ra là:

    Mã:
    pointer_to_function.cpp: In function ‘int main()’:
    pointer_to_function.cpp:12:10: error: reference to ‘minus’ is ambiguous
    pointer_to_function.cpp:6:5: error: candidates are: int minus(int, int)
    /usr/include/c++/4.6/bits/stl_function.h:150:12: error:                 template<class _Tp> struct std::minus
    Như vậy là phép gán " func = &minus;" có vấn đề.

    Có bạn nào biết tại sao không?
    Contact me:
    Email: sangnd [at] svBK.vn
    Personal website: My Blog | Chat với người lạ
    Facebook Page của Bách Khoa Forum: http://www.facebook.com/svbk.vn

  2. #2
    HUT's Student
    Tham gia ngày
    Feb 2012
    Bài gửi
    272

    Mặc định Re: Gặp lỗi với con trỏ hàm trong C++

    Tên hàm minus trùng với một template nào đó trong namespace std.
    Giải pháp là bỏ dòng using namespace std đi.

  3. #3
    HUT's Engineer
    Tham gia ngày
    Jun 2011
    Bài gửi
    686

    Mặc định Re: Gặp lỗi với con trỏ hàm trong C++

    viết C++ sao cứ đoán bừa thế Sang, phải chịu khó đọc thông báo lỗi chứ

    cả phải viết func = minus chứ nhỉ, sao lại func = &minus

  4. #4
    .:: Grumpy svBKer ::. Avatar của 1973
    Tham gia ngày
    Mar 2010
    Bài gửi
    3.793

    Mặc định Re: Gặp lỗi với con trỏ hàm trong C++

    Quote Nguyên văn bởi boss14420 Xem bài viết
    Tên hàm minus trùng với một template nào đó trong namespace std.
    Giải pháp là bỏ dòng using namespace std đi.
    Nếu bỏ using namespace std đi thì không include được iostream. Nó báo lỗi:

    Mã:
    pointer_to_function.cpp:13:2: error: ‘cout’ was not declared in this scope
    pointer_to_function.cpp:13:2: note: suggested alternative:
    /usr/include/c++/4.6/iostream:62:18: note:   ‘std::cout’
    pointer_to_function.cpp:13:34: error: ‘endl’ was not declared in this scope
    pointer_to_function.cpp:13:34: note: suggested alternative:
    /usr/include/c++/4.6/ostream:543:5: note:   ‘std::endl’
    còn nếu include iostream.h thì báo lỗi "fatal error: iostream.h: No such file or directory".

    Cách sửa là đổi tên hàm minus thành tên khác.


    Quote Nguyên văn bởi pkthanh92 Xem bài viết
    viết C++ sao cứ đoán bừa thế Sang, phải chịu khó đọc thông báo lỗi chứ

    cả phải viết func = minus chứ nhỉ, sao lại func = &minus
    Sao lại đoán bừa? Đọc lỗi chỉ hiểu là hàm minus dễ gây hiểu nhầm nhưng mình vẫn không rõ nguyên nhân thực sự là thế nào.

    Các tài liệu tớ thấy viết là func = minus nhưng theo suy luận logic hướng con trỏ thì ta phải truyền vào địa chỉ của hàm chứ nhỉ. Tớ thử cả 2 cách đều không thấy báo lỗi.

  5. #5
    svBK's Member
    Tham gia ngày
    Feb 2012
    Bài gửi
    26

    Mặc định Re: Gặp lỗi với con trỏ hàm trong C++

    Quote Nguyên văn bởi 1973 Xem bài viết

    Các tài liệu tớ thấy viết là func = minus nhưng theo suy luận logic hướng con trỏ thì ta phải truyền vào địa chỉ của hàm chứ nhỉ. Tớ thử cả 2 cách đều không thấy báo lỗi.
    Hồi xưa C chưa có khái niệm tham chiếu nên mới dùng con trỏ để có thể quản lý biến, nhưng C++ đã định nghĩa khái niệm tham chiếu nên cách quản lý biến cũng linh hoạt hơn tý

  6. #6
    HUT's Student
    Tham gia ngày
    Feb 2012
    Bài gửi
    272

    Mặc định

    Quote Nguyên văn bởi 1973 Xem bài viết
    Nếu bỏ using namespace std đi thì không include được iostream. Nó báo lỗi:

    Mã:
    pointer_to_function.cpp:13:2: error: ‘cout’ was not declared in this scope
    pointer_to_function.cpp:13:2: note: suggested alternative:
    /usr/include/c++/4.6/iostream:62:18: note:   ‘std::cout’
    pointer_to_function.cpp:13:34: error: ‘endl’ was not declared in this scope
    pointer_to_function.cpp:13:34: note: suggested alternative:
    /usr/include/c++/4.6/ostream:543:5: note:   ‘std::endl’
    còn nếu include iostream.h thì báo lỗi "fatal error: iostream.h: No such file or directory".

    Cách sửa là đổi tên hàm minus thành tên khác.
    Thay cout bằng std::cout, endl bằng std::endl. Xem thêm ở đây:
    http://openandfree.wordpress.com/2007/08/28/co-nen-sử-dụng-using-namespace-std-hay-khong/
    iostream.h thì tuyệt đối không dùng, nó không phải là chuẩn.
    Quote Nguyên văn bởi 1973 Xem bài viết
    Sao lại đoán bừa? Đọc lỗi chỉ hiểu là hàm minus dễ gây hiểu nhầm nhưng mình vẫn không rõ nguyên nhân thực sự là thế nào.
    ambigous có nghĩa là mơ hồ, với gcc thì có nghĩa là nó trùng với cái tên nào đó đã khai báo mà trình dịch không biết dùng cái nào thì mới thích hợp với ngữ cảnh.

    Quote Nguyên văn bởi pain Xem bài viết
    Hồi xưa C chưa có khái niệm tham chiếu nên mới dùng con trỏ để có thể quản lý biến, nhưng C++ đã định nghĩa khái niệm tham chiếu nên cách quản lý biết cũng linh hoạt hơn tý
    Chả liên quan.

    Đúng là với suy luận thông thường thì phải thêm toán tử lấy địa chỉ trước tên hàm, nhưng C/C++ nó du di cho trường hợp này, và chỉ trường hợp này.
    Lần sửa cuối bởi boss14420; 03-08-2012 lúc 05:51 PM

+ Trả lời chủ đề

Thông tin chủ đề

Users Browsing this Thread

Hiện có 1 người đọc bài này. (0 thành viên và 1 khách)

Từ khóa (Tag) của chủ đề này

Quyền viết bài

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


About svBK.VN

    Bách Khoa Forum - Diễn đàn thảo luận chung của sinh viên ĐH Bách Khoa Hà Nội. Nơi giao lưu giữa sinh viên - cựu sinh viên - giảng viên của trường.

Follow us on

Twitter Facebook youtube