Perché non è possibile una struttura definita all'interno di una funzione essere utilizzata come functor a std :: for_each?

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

Domanda

Il seguente codice non viene compilato. Il compilatore si lamenta * nessuna funzione di corrispondenza per chiamata a for_each *. Perché è così?

#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());
}

Quando sposto struct FlipFunctor prima funzione flip_all, il codice viene compilato.

messaggio di errore completo:

nessuna funzione di corrispondenza per la chiamata a 'for_each (std :: _ Rb_tree_iterator >, std :: _ Rb_tree_iterator >, flip_all (std :: map , std :: allocator >>) :: FlipFunctor) '

È stato utile?

Soluzione

std::for_each è un modello di funzione; uno dei parametri di modello è il tipo di argomento della funzione.

Non è possibile utilizzare un tipo di locale come argomento di template. E 'solo una restrizione attualmente nella lingua. Nella prossima revisione del C ++, C ++ 0x, questa limitazione viene rimosso, in modo da poter utilizzare i tipi di locali come argomenti di template.

Visual C ++ 2010 supporta già l'uso delle classi locali come argomenti di template; supporto in altri compilatori può variare. Direi che qualsiasi compilatore che supporta i linguaggi C ++ 0x lambda sarebbe anche sostenere l'uso di classi locali come argomenti di template (questo potrebbe non essere del tutto vero, ma non avrebbe molto senso).

Altri suggerimenti

ottengo un altro errore quando provo a compilare il codice:

errore: 'flip_all (__ gnu_debug_def :: mappa, std :: allocator>>) :: FlipFunctor' utilizza tipo locale 'flip_all (__ gnu_debug_def :: mappa, std :: allocator>>) :: FlipFunctor'

Che in realtà è da aspettarselo, perché un tipo di locale, la funzione (come il tuo FlipFunctor qui) ha il collegamento interno, e un tipo di modello deve avere collegamento esterno. Dal momento che il terzo parametro di std :: for_each è un modello, non è possibile passare una sorta di tipo locale, la funzione ad esso.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top