2010-10-01 6 views
0

Je suis en train de mettre en œuvre une fonction qui me permet de faire un appel comme celui-citemplate vecteur

// veca is a vector of tuples in my case 
columnViewOfTuple<0>(veca); 

I mis en œuvre cette fonction comme suit

template<int N> 
struct myfunction { 
    template<typename T, typename R> 
    std::vector<R> operator() (T& container) 
    { 
     std::vector<R> myvector; 
     for(typename T::iterator it = container.begin(); it!=container.end(); it++) 
      myvector.push_back((R)(*it).template get<N>()); 
     return myvector; 
    } 
}; 

chaque fois que j'appelle myfunction < 0> (vec5), où vec5 est un vecteur de tuples, il est dit

main.cpp: Dans la fonction 'int main()': main.cpp: 156: erreur: déclaration conflictuelle 'myfunction 0 Main.cpp: 155: erreur: 'vec5' a une déclaration précédente en tant que 'main() :: vec1_t vec5'

Vous savez comment résoudre ce problème?

Merci

+0

Pourquoi voulez-vous que l'int N soit un paramètre de modèle au lieu d'un paramètre de fonction? – JoshD

+0

Voir, par exemple: http://stackoverflow.com/questions/1600464/ –

+0

c'est une exigence. J'ai besoin de N comme paramètre de template – Bob

Répondre

5

La boucle doit être

for(typename T::iterator it = container.begin(); it!=container.end(); it++) 
     myvector.push_back((R)(*it).template get<N>()); 

Sinon, le compilateur traitera T::iterator comme non type (à parse-temps, il ne sait pas encore ce que sera T::iterator!) et l'analysera probablement comme le seul constituant d'une expression. Le it qui suit ensuite est un non-sens pour le compilateur donc il attend un ; avant.

typename est utilisé pour indiquer au compilateur qu'un certain nom qualifié est destiné à indiquer un type au lieu d'une valeur (fonction/membre de données statiques/etc).

Le deuxième problème, qui est résolu en ajoutant template est de type similaire. Il indique au compilateur que get est un modèle et que <N n'est donc pas une comparaison avec N, mais le début d'une liste d'arguments de modèle.

+0

+1: spotting manquant 'typename' et manquant' template'. –

+0

+1 pour ce modèle (et une bonne réponse dans l'ensemble). Malheureusement, je ne le savais pas moi-même. – JoshD

2

Vous devez utiliser typename devant T::iterator. Donc, dites typename T::iterator.

Éditez1 en incluant template comme indiqué par Johannes pour éviter toute désinformation.

Ainsi, votre code devrait ressembler à ceci:

template<int N> 
struct myfunction { 
    template<typename T, typename R> 
    std::vector<R> operator() (T& container) 
    { 
     std::vector<R> myvector; 
     for(typename T::iterator it = container.begin(); it!=container.end(); it++) 
      myvector.push_back((R)(*it).template get<N>()); 
     return myvector; 
    } 
}; 
+0

merci, cela a été utile. Cependant, j'ai essayé d'utiliser la fonction – Bob