2017-05-25 3 views
0

Ich versuche, eine statische Funktion für ein Element eines Vektors innerhalb einer Template-Funktion aufzurufen. Aber ich kann den Code nicht funktionieren. Ich bekomme den Fehler: "Do" ist kein Mitglied von "__gnu_cxx :: __ alloc_traits" :: value_type & {aka A &} 'Irgendwelche Ideen?Aufruf der Klassenfunktion auf dem Vorlagenelement

struct A { 
    static void Do() { cout << "Hey.\n"; } 
}; 

template <typename T> 
void foo(T* v) { 
    decltype(v->at(0))::Do(); 
} 

int main() { 
    vector<A> v; 
    foo(&v); 
    return 0; 
} 
+0

OK, das wurde hier beantwortet: https://stackoverflow.com/questions/44189845/stdvector-insert-without-nowing-the-type-of-the-elements?noredirect=1#comment75393783_44189845 –

+0

also warum fragst du dies, wenn Sie Ihre vorherige Frage (40 Minuten früher) auch eine gültige Antwort auf diese erhalten? Eigentlich von derselben Person, die hier wieder antwortet. – Walter

Antwort

3
T::value_type::Do(); 

Oder

std::remove_reference<decltype(v->at(0))>::type::Do(); 

Oder

std::decay<decltype(v->at(0))>::type::Do(); 

Oder wenn Sie nicht über die Durchsetzung statisch-ness (und wissen, um den Vektor sein nicht leer) ist es egal:

v->at(0).Do(); 
+0

Nit: die letzte Version funktioniert nicht, wenn der Vektor leer ist, also brauche ich Statik. –

+0

@LajosNagy Aber Sie müssen 'at (0)' nicht aufrufen, Sie können 'operator []' verwenden, dh '(* v) [0] .Do();', was auch für einen leeren Vektor gilt arbeiten (da das betreffende Element nicht verwendet wird). – Walter

Verwandte Themen