2012-03-19 9 views
7

Sto cercando di utilizzare una classe locale come un functor e ottenere l'errore del compilatore utilizzando g ++ (3.4.6).Classe locale C++ come functor

Inserendo la classe sottostante (Processor) nell'ambito globale risolve l'errore, quindi suppongo che l'errore sia dovuto a strutture/classi locali della funzione. Preferirei avere le classi all'interno della funzione per chiarezza del codice e facilità d'uso. Vuoi sapere se esiste una soluzione alternativa per far funzionare il codice qui sotto.

test.cpp: 24: Errore: nessuna funzione di corrispondenza per chiamata a \ u2018foreachArg (int &, char * &, processSubs (int, char * ) :: Processore &) \ u2019

template <class Functor> 
void foreachArg(int n, char *args[], Functor& f) 
{ 
    for(int i=0; i<n; ++i) 
     f(args[i]); 
} 

int processSubs(int argc, char *args[]) 
{ 
    class Processor 
    { 
     public: 
      void operator()(const char *arg) 
      { 
      } 
    }; 

    Processor p; 
    foreachArg(argc, args, p); 
} 

int main(int argc, char *argv[]) 
{ 
    processSubs(argc, argv); 
} 
+0

No, le due opzioni utilizzano un compilatore compatibile con C++ 11 o spostano la classe all'esterno della funzione. –

+0

Consultare: http://stackoverflow.com/a/2598272/294864 per un riferimento alla specifica before-C++ 11 riguardante le strutture anonime come argomenti del modello. – Akanksh

+0

C'è una terza opzione: utilizzare un idioma del sintetizzatore "locale". Boost ne sta aggiungendo uno, per esempio. –

risposta

9

In C++, prima di C++ 11, le classi utilizzate come argomenti per le funzioni dei modelli devono avere un collegamento esterno. Le classi locali non hanno un collegamento esterno, quindi non è possibile utilizzarle in questo modo.

C++ 11 cambia questo, quindi si può essere in grado di risolvere questo problema impostando il compilatore per utilizzare C++ 11.

+0

sfortunatamente usando un compilatore (3.4.6 --- bloccato in età della pietra: P) che non supporta C++ 0x in modo da cercare una soluzione intelligente – Shanky

+0

Non c'è davvero una soluzione alternativa. Alcuni compilatori hanno un'estensione per consentire questo pre-C++ 11, ma non gcc per quanto ne so. Se sei bloccato con il tuo compilatore corrente non penso che ci sia un'opzione migliore di spostare il functor fuori dall'ambito locale. @Shanky – bames53

+0

Esiste davvero qualche soluzione alternativa. Non sono sicuro che funzioni in GCC 3.x, ma in GCC 4.2 e 4.4 sto usando un semplicissimo idioma 'LOCAL_FUNCTION', basato sull'ereditarietà e la specializzazione dei template, che delega la funzione effettiva chiamata a funtori esterni, base che virtualmente inoltrano a quelli locali. Boost sembra aver lanciato di recente qualcosa di simile (e come al solito con Boost, molto meglio ma con una enorme complessità e costi di dipendenza). –

0

Non è possibile creare un'istanza di modelli con classi locali in C++ 03.

Inoltre, lo Standard fornisce già una funzione per questo- std::for_each.

0

C++ 03 non consente alle classi definite localmente di essere argomenti di template, come hai scoperto qui. C++ 11 consente questo. Con gcc, potresti provare a compilare con --std=c++0x

+0

sfortunatamente usando un compilatore (3.4.6 --- bloccato nell'età della pietra: P) che non supporta C++ 0x, quindi cercando una soluzione intelligente – Shanky

0

Come si è detto, utilizzando le classi locali per questo non era possibile pre-C++ 11, e circa inutile in C++ 11 perché lambda sono meno prolisso.

Devi semplicemente dichiarare la tua classe al di fuori della funzione.

Problemi correlati