Problem mit templates und typedefs



  • Hi Leute,
    Ich hab hier zwei Probleme, die etwas miteinander verknüpft sind, daher ein Thread.

    Ich versuche einen ganz einfachen Vergleichsfunktionszeiger mit template-Parametern per typedef zu definieren.
    Mein Versuch sieht so aus:

    typedef template <class X> bool (*TheSame)(const X &One, const X &Two); //Zeile 59
    

    Mein MS VS 7.1 meint nur:

    MS VS 7.1 schrieb:

    d:\Programmierung\Projekte\X.cpp(59) : error C2059: Syntaxfehler: ''template<''

    So, das war eigentlich mein Hauptproblem.
    Dann hab ich noch ein zweites, welches ich aber mit einem Workaround gelöst hab, der mir aber net so doll erscheint. Ich habe eine Funktion Find, die in einem std::vector nach einem Element sucht.
    Die sieht so aus:

    template <class X> int Find(std::vector<X> &vecToFindIn, const X &ToFind)
    {
        std::vector<X>::iterator p;
        p=vecToFindIn.begin();
        while(p!=vecToFindIn.end())
        {
            if(*p==ToFind)
                return p-vecToFindIn.begin();
            p++;
        }
        return -1;
    }
    

    Die wollte ich jetzt erweitern, so dass sie für alle Containerklassen der STL funktioniert, die mit iteratoren arbeiten. Mein Versuch:

    template <class X> bool DefaultTheSame(const X &One, const X &Two)
    {
        return One==Two;
    }
    
    template <class Y,class X> int Find(Y<X> &vecToFindIn, const X &ToFind, TheSame Func=DefaultTheSame) // Zeile 66
    {
        Y<X>::iterator p;
        p=vecToFindIn.begin();
        while(p!=vecToFindIn.end())
        {
            if(Func(*p,ToFind))
                return p-vecToFindIn.begin();
            p++;
        }
        return -1;
    }
    

    Wenn ich das so mache, bekomm ich ne ganze Reihe an Fehlern:

    MS VS 7.1 schrieb:

    d:\Programmierung\Projekte\X.cpp(66) : error C2143: Syntaxfehler: Es fehlt ')' vor '<'
    d:\Programmierung\Projekte\X.cpp(66) : error C2143: Syntaxfehler: Es fehlt ';' vor '<'
    d:\Programmierung\Projekte\X.cpp(66) : error C2988: Unerkannte Vorlagendeklaration/-definition
    d:\Programmierung\Projekte\X.cpp(66) : error C2059: Syntaxfehler: '<'
    d:\Programmierung\Projekte\X.cpp(66) : error C2059: Syntaxfehler: ')'

    Ich dachte mir das so, dass Y dann zB std::vector ist und X dann der Typ des Containers. Damit will ich verhindern, dass jemand zB einen std::vector<int> übergibt, als ToFind aber einen zB einen std::string.
    Mein Workaround sieht so aus, dass ich statt Y<X> einfach nur Y schreib, was allerdings das obige Problem nicht verhindert.

    Ich würde von euch jetzt gerne wissen, ob das was ich vorhab

    1. Schwachsinn und/oder
    2. unmöglich ist

    Falls es "weder-noch" ist, würde ich mich über ne Lösung freuen 🙂



  • Trifft das dein Problem?
    http://www.gotw.ca/gotw/079.htm



  • Danke für den Link.

    http://www.gotw.ca/gotw/0 schrieb:

    Today's C++ doesn't support template typedefs

    Na toll ... Muss ich mir nachher mal den Workaround angucken, der da beschrieben ist, muss jetzt erstmal zur Schule.
    Was ist mit meinem zweiten Problem? Hast du da auch nen coolen Link? 🙂



  • Kommst du nicht mit

    typename Y::value_type

    an den "Element-Typ" des Containers? Dann könntest du X ganz rauslassen.



  • ein paar hints:

    #include <algorithm>
    #include <vector>
    using namespace std;
    
    template <template <class> class X, class Y> //template template parameter syntax
    int distanz (const X<Y> &v, const Y &el) {
    	int tmp = distance(v.begin(),find(v.begin(),v.end(),el)); //holla
    	return (tmp == v.size() ? -1 : tmp); //warum -1?
    }
    
    int main () {
    	vector<int> x;
    	x.push_back(4); x.push_back(2); x.push_back(3); x.push_back(8);
    
    	cout << "Distanz: " << distanz(x,3) << '\n';	
    }
    

Anmelden zum Antworten