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

daje mi błąd:decltype z funkcji członka

error: decltype cannot resolve address of overloaded function 

Nie mogę zrozumieć, dlaczego ten błąd jest nawet mówiąc o przeciążonych funkcji. Podobnie myślałem, że może ja potrzebowałem użyć operatora zakresu, aby uzyskać dostęp do funkcji:

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

która wciąż daje mi błąd, ale jasny opis:

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

Dlaczego jest to, że nie jestem można używać decltype, aby znaleźć typ funkcji członka? Alternatywnie ustawienie funkcji składowej na static powoduje usunięcie błędu w obu przypadkach.

+0

jakiej wersji kompilatora i kompilatora używasz? –

+0

@RichardChambers g ++ 4.8.1 – Silversonic

Odpowiedz

5

Co naprawdę chcesz to:

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

Live demo

Ponieważ f masz na myśli to funkcja członkiem. Wydedukowana typ to:

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

Bez & kompilator zakłada, że ​​starasz się wywołać funkcję bez podania argumentów do niego. Być może komunikat o błędzie dzyń jest jaśniejszy o tym:

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

Jeśli naprawdę nie chcesz typ wskaźnika można później zastosować std::remove_pointer_t od <type_traits>.

+0

"kompilator zakłada, że ​​próbujesz wywołać funkcję bez podawania argumentów". To dziwne, ponieważ nie zakładałoby, że jeśli przekażę decltype z nazwą zwykłej funkcji. Nie wiedziałem też, że typ członków klasy jest poprzedzony operatorem zasięgu - na co powinienem zwrócić uwagę, aby zrozumieć, że nieco lepiej? – Silversonic

+0

@Silversonic "Wskaźnik funkcji członka" Zgaduję. Pamiętaj, że każda niestatyczna funkcja członkowska musi mieć również "this" "niejawnie przekazane do niej", więc możesz zobaczyć 'Return (Class :: *) (Arg1, Arg2, ...)' jako 'Return (Class * const , Arg1, Arg2, ...) 'i dlatego' Return (Class :: *) (Arg1, Arg2, ...) 'i' Return (*) (Arg1, Arg2, ...) 'nie mogą być ten sam typ. – Shoe

Powiązane problemy