function argument template specialisation
-
Hi,
habe eine callback funktion
static void output(element<double>& ele) { cout<<setw(20)<<(char*)(ele)<<setw(10)<<long(ele)<<endl; }für eine stack implementierung.
Aufruf:#include "stdafx.h" using namespace std; static void output(element<>& ele); int _tmain(int argc, _TCHAR* argv[]) { stack<double> vars; char selection; char name[20]; long value; for(;;) { cout<<"<N>eue Variable" << endl << "<L>öschen einer Variable" << endl << "<A>nzeigen einer Variable" << endl << "<W>ert einer Variable ändern" << endl << "<D>rucken aller am Schirm" << endl << "<Q>uit" << endl; cin>>selection; switch(tolower(selection)) { case 'q': return 0; case 'n': cout<<"Name: "; cin>>name; cout<<"Wert: "; cin>>value; vars.newvar(name, value);break; case 'l': cout<<"Name zu löschen: ";cin>>name; cout<<(vars.delvar(name) ? "gelöscht":"nicht gelöscht")<<endl; break; case 'a': cout<<"Wert anzeigen für Name: "; cin>>name; if (vars.getval(name,value)) cout<<"gefunden mit wert "<<value<<endl; else cout<<"nicht gefunden"<<endl; break; case 'w': cout<<"Wert für name ändern: "; cin>>name; cout<<"Neuer Wert: "; cin>>value; if (vars.changeval(name,value)) cout<<"gefunden und wert geändert"<<endl; else cout<<"nicht gefunden"<<endl; break; case 'd': cout<<endl<<setw(20)<<"NAME"<<setw(10)<<"WERT"<<endl; ---------> vars.walk(output); <--------- break; default: cout<<"Falsche Auswahl."<<endl; } } return 0; } static void output(element<double>& ele) { cout<<setw(20)<<(char*)(ele)<<setw(10)<<long(ele)<<endl; }bei
template<class T> void stack<T>::walk(typename t_to_do_fkt<T>::fpt to_do) { knoten* q; for (q=anfang; q; q = q->next) (*to_do) (q->info); }und
template<class Ty> struct t_to_do_fkt { typedef void (*fpt) (element<Ty>& ele); };leider
error C2664: 'stack<T>::walk': Konvertierung des Parameters 1 von 'void (__cdecl *)(element<> &)' in 'void (__cdecl *)(element<Ty> &)' nicht möglichohgottwassollichnurmachendanke.

-
Nun die Fehlermeldung sagt doch schon wo dein Problem sein könnte:
element<>ist nicht äquivalent mitelement<Ty>. Zu dem Zeitpunkt wo der Compiler die Fehlermeldung generiert ist im Scope nur die Überladung fürelement<>bekannt.MfG
-
Pass ausserdem auf, wenn du
using namespace std;in deinem Programm hast und gleichzeitig Bezeichner wählst, die sich mit denen der Standardbibliothek überschneiden (
stack). Nicht dass du später in Namenskonflikte gerätst und völlig ratlos dastehst.