2 Stimmen

Vorlage Iterator innerhalb von Vorlagenklasse, Clang kann Vorlagenparameter nicht ableiten

Ich habe eine Template-Klasse mit einem verschachtelten Template-Custom-Iterator (spezialisiert auf const/non-const Iteratoren) wie folgt :

template 
struct A
{
    template 
    struct AIterator
    {
        //...
    };

    typename AIterator iterator;
    typename AIterator const_iterator;
};

template 
bool operator==(const typename A::iterator& lhs,
                const typename A::iterator& rhs,)
{
    //...
}

template 
bool operator!=(const typename A::iterator& lhs,
                const typename A::iterator& rhs,)
{
    //...
}

//das Gleiche für const_iterator...

Aber clang kann den Template-Parameter nicht ableiten :

snake_test.cpp:17:68: Fehler: Ungültige Operanden für binären Ausdruck ('wavelet::Snake::const_iterator' (aka 'Iterator') und 'const_iterator' (aka 'Iterator'))
        for (wavelet::Snake::const_iterator it = snake.begin(); it != snake.end(); it++)
                                                                       ~~ ^  ~~~~~~~~~~~
./snake.hpp:150:6: Hinweis: Ignoriertes Kandidaten-Template: Konnte den Template-Argument 'T' nicht ableiten
bool operator!=(const typename Snake::iterator& lhs,
     ^
./snake.hpp:164:6: Hinweis: Ignoriertes Kandidaten-Template: Konnte den Template-Argument 'T' nicht ableiten
bool operator!=(const typename Snake::const_iterator& lhs,
     ^
1 error generated.

Was mache ich falsch? Wie implementiere ich benutzerdefinierte Iteratoren für Template-Klassen?

4voto

dyp Punkte 37134

Die möglicherweise einfachste und sauberste Lösung besteht darin, Nicht-Mitgliedsfreundefunktionen zu verwenden, die innerhalb des Körper der Klasse definiert sind:

template 
struct A
{
    template 
    struct AIterator
    {
        friend bool operator==(AIterator const& lhs, AIterator const& rhs)
        { /* hier implementieren */ }
    };

    typename AIterator iterator;
    typename AIterator const_iterator;
};

Dies wird eine Nicht-Mitgliedsfunktion für jede Spezialisierung von AIterator erstellen. Sie können die Definition für diese Nicht-Mitgliedsfunktion meines Wissens nach nicht außerhalb bereitstellen - es handelt sich nicht um eine Funktionsvorlage, sondern um eine echte Funktion für jede Spezialisierung. Daher können Sie nur eine festgelegte Anzahl von Spezialisierungen im globalen Namensraum definieren.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X