Tôi đang bối rối bởi tình huống này và googling đã không cho tôi câu trả lời. Về cơ bản tôi có mã đơn giản sau đây mà không biên dịch:Gọi mơ hồ đến chức năng tĩnh quá tải
#include <iostream>
class A
{
public:
int a(int c = 0) { return 1; }
static int a() { return 2; }
};
int main()
{
std::cout << A::a() << std::endl;
return 0;
}
Trong biên soạn này, GCC 4.2 cho biết cuộc gọi đến A::a()
trong main()
không rõ ràng với cả hai phiên bản a()
ứng cử viên hợp lệ. Trình biên dịch LLVM của Apple 3.0 biên dịch không có lỗi.
Tại sao gcc nhầm lẫn về chức năng tôi muốn gọi? Tôi nghĩ rõ ràng là bằng cách đủ điều kiện a()
với A::
Tôi yêu cầu phiên bản static
của hàm. Đương nhiên mã này vẫn không biên dịch nếu tôi xóa chức năng static
a()
, vì A::a()
không phải là cú pháp hợp lệ để gọi số .
Cảm ơn mọi nhận xét!
BTW, tìm kiếm nhanh trên google của tôi: "Độ phân giải tên của các hàm thành viên tĩnh và không tĩnh C++" đã đưa ra một câu hỏi SO khác: http: //stackoverflow.com/questions/5365689/c-overload-static-function -with-non-static-function – Bingo
oops google-fu của tôi không thành công ... – fang