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öglich
    

    ohgottwassollichnurmachendanke. 😋



  • Nun die Fehlermeldung sagt doch schon wo dein Problem sein könnte: element<> ist nicht äquivalent mit element<Ty> . Zu dem Zeitpunkt wo der Compiler die Fehlermeldung generiert ist im Scope nur die Überladung für element<> 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. 😉


Anmelden zum Antworten