Warum kann eine Struktur, die innerhalb einer Funktion definiert ist, nicht als Funktion für std :: for_each verwendet werden?

StackOverflow https://stackoverflow.com/questions/4550914

Frage

Der folgende Code wird nicht kompilieren. Der Compiler beschwert sich über *keine Übereinstimmungsfunktion für den Anruf bei for_each *. Warum ist das so?

#include <map>
#include <algorithm>

struct Element
{
    void flip() {}
};

void flip_all(std::map<Element*, Element*> input)
{
    struct FlipFunctor
    {
        void operator() (std::pair<Element* const, Element*>& item)
        {
            item.second->flip();
        }
    };

    std::for_each(input.begin(), input.end(), FlipFunctor());
}

Wenn ich bewege struct FlipFunctor Vor der Funktion flip_all, der Code kompiliert.

Vollständige Fehlermeldung:

Keine Übereinstimmungsfunktion für Anruf bei 'for_each (std :: _ rb_tree_iterator u003Cstd::pairu003CElement* const, Element*> >, std :: _ rb_tree_iterator u003Cstd::pairu003CElement* const, Element*> >, flip_all (std :: map u003CElement*, Element*, std::lessu003CElement*> , std :: allocator u003Cstd::pairu003CElement* const, Element*> >>)) :: Flipfunctor) '

War es hilfreich?

Lösung

std::for_each ist eine Funktionsvorlage; Einer der Vorlagenparameter ist der Typ des Funktionsarguments.

Sie können keinen lokalen Typ als Vorlagenargument verwenden. Es ist nur eine Einschränkung in der Sprache. Bei der bevorstehenden Überarbeitung von C ++, C ++ 0x, wird diese Einschränkung entfernt, sodass Sie lokale Typen als Vorlagenargumente verwenden können.

Visual C ++ 2010 unterstützt bereits die Verwendung lokaler Klassen als Vorlagenargumente. Die Unterstützung in anderen Compilern kann variieren. Ich würde vermuten, dass jeder Compiler, der C ++ 0x Lambdas unterstützt, auch die Verwendung lokaler Klassen als Vorlagenargumente unterstützen würde (dies ist möglicherweise nicht ganz wahr, aber es wäre sinnvoll).

Andere Tipps

Ich erhalte einen anderen Fehler, wenn ich versuche, Ihren Code zu kompilieren:

Fehler: 'Flip_all (__ gnu_debug_def :: map, std :: allocator >>) :: flipfunctor' verwendet lokaler Typ 'Flip_all (__ gnu_debug_def :: map, std :: allocator>) :: flipfunctor'

Dies ist eigentlich zu erwarten, da ein Funktionsart lokaler Funktion (z. Seit dem dritten Parameter von std :: for_each ist Eine Vorlage, Sie können nicht eine Funktion lokaler Typ an sie übergeben.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top