2015-10-13 27 views
6
class A { 
    int f(int x, int j) { return 2;} 
    decltype(f)* p; 
}; 

Cung cấp cho tôi những lỗi:Decltype chức năng thành viên

error: decltype cannot resolve address of overloaded function 

Tôi không thể hiểu tại sao lỗi mà thậm chí còn nói về chức năng quá tải. Tương tự như vậy, tôi nghĩ rằng có lẽ tôi cần phải sử dụng toán tử phạm vi để truy cập các chức năng:

class A { 
    int f(int x, int j) { return 2;} 
    decltype(A::f)* p; 
}; 

nào vẫn mang lại cho tôi một lỗi nhưng một mô tả rõ ràng hơn:

error: invalid use of non-static member function 'int A::f(int, int)' 

Tại sao nó rằng tôi không được phép sử dụng decltype để tìm loại chức năng thành viên? Cách khác, đặt chức năng thành viên là static sẽ xóa lỗi trong cả hai trường hợp.

+0

bạn đang sử dụng phiên bản trình biên dịch và trình biên dịch nào? –

+0

@RichardChambers g ++ 4.8.1 – Silversonic

Trả lời

5

gì bạn thực sự muốn là:

struct a { 
    int f(int x, int j) { return 2;} 
    decltype(&a::f) p; 
}; 

Live demo

Kể từ khi f bạn đang đề cập đến là một hàm thành viên. Các loại suy luận là:

int(a::*)(int, int) 

Nếu không có sự & trình biên dịch là giả định rằng bạn đang cố gắng để gọi hàm mà không cung cấp luận cứ để nó. Có lẽ thông báo lỗi Clang là rõ ràng hơn về vấn đề này:

error: call to non-static member function without an object argument 
    decltype(a::f) p; 

Nếu bạn thực sự không muốn kiểu con trỏ sau đó bạn có thể áp dụng std::remove_pointer_t từ <type_traits>.

+0

"trình biên dịch giả định rằng bạn đang cố gắng gọi hàm mà không cung cấp đối số cho nó." Đó là lạ vì nó sẽ không giả định rằng nếu tôi thông qua decltype với tên của một chức năng bình thường. Ngoài ra tôi đã không nhận thức được rằng các loại thành viên lớp là trước bởi một nhà điều hành phạm vi - những gì tôi nên tìm kiếm để hiểu rằng tốt hơn một chút? – Silversonic

+0

@Silversonic "Con trỏ hàm thành viên" tôi đoán vậy. Hãy nhớ rằng bất kỳ hàm thành viên không tĩnh nào cũng cần phải có 'this'" được truyền vào nó một cách ngầm định "để bạn có thể thấy một' Return (Class :: *) (Arg1, Arg2, ...) 'là' Return (Class * const) , Arg1, Arg2, ...) 'và đó là lý do tại sao' Return (Class :: *) (Arg1, Arg2, ...) 'và' Return (*) (Arg1, Arg2, ...) 'không thể là cùng loại. – Shoe

Các vấn đề liên quan