2010-07-11 8 views
0

pourquoi dans la première ligne de ce code:erreur modèle gcc

template <typename VectorType> 
std::string repr_vector_dynamic(const VectorType* vect) 
{ 
    std::stringstream strs; 
    strs << "("; 
    for (int i = 0; i < vect->size(); ++i) { 
     if (0 != i) { 
      strs << ", "; 
     } 
     strs << (*vect)[i]; 
    } 
    strs << ")"; 
    return strs.str(); 
} 

Je reçois toujours thsese erreurs à la première ligne: (MinGW gcc 4,5)

attendu ';' avant 'modèle'

expression primaire attendue avant 'modèle'

thx

plus tard modifier: voici la ligne de commande/log je suis arrivé de l'éclipse:

g++ -II:\proj\bp\PyCML -IC:\PF\Python26\include -II:\proj\bp/include -O3 -Wall -c -fmessage-length=0 -oPyCML\cml.o ..\PyCML\cml.cpp 
In file included from I:\proj\bp/include/boost/python/object/make_instance.hpp:9:0, 
      from I:\proj\bp/include/boost/python/object/make_ptr_instance.hpp:8, 
      from I:\proj\bp/include/boost/python/to_python_indirect.hpp:11, 
      from I:\proj\bp/include/boost/python/converter/arg_to_python.hpp:10, 
      from I:\proj\bp/include/boost/python/call.hpp:15, 
      from I:\proj\bp/include/boost/python/object_core.hpp:14, 
      from I:\proj\bp/include/boost/python/args.hpp:25, 
      from I:\proj\bp/include/boost/python.hpp:11, 
      from ..\PyCML\cml.cpp:11: 
I:\proj\bp/include/boost/python/object/instance.hpp:14:36: warning: type attributes ignored after type is already defined 
In file included from ..\PyCML\cml.cpp:28:0: 
I:\proj\bp\PyCML/PyCMl/vector.h: In function 'void init_module_PyCML()': 
I:\proj\bp\PyCML/PyCMl/vector.h:22:1: error: expected primary-expression before 'template' 
I:\proj\bp\PyCML/PyCMl/vector.h:22:1: error: expected ';' before 'template' 
..\PyCML\cml.cpp:58:1: error: expected '}' at end of input 
+2

Qu'est-ce que ** before ** 'template' dans votre code? Avez-vous oublié de mettre le ';' à la fin d'une déclaration de classe immédiatement avant ce modèle de fonction? –

+0

il n'y a que des inclusions provenant d'autres bibliothèques – lj8888

+0

Que se passe-t-il si vous ajoutez une autre déclaration avant votre modèle? C'est à dire "void funcdecl (void)"; cela provoquera-t-il une erreur avant votre modèle ou un point-virgule manquant avant la déclaration factice? – epatel

Répondre

0

Les erreurs que vous avez affichées suggèrent que le problème est dans la fonction void init_module_PyCML(). Il semblerait donc que vous ayez essayé de définir un modèle de fonction dans le corps d'une autre fonction.

Par exemple essayer de compiler le code suivant me donne la même erreur

void f() 
{ 

template < typename T > 
void g() 
{ 
}; 

} 

La dernière ligne d'erreur suggère que peut-être vous avez oublié la fermeture } pour init_module_PyCML()?

+0

J'ai la bonne réponse, dans mon esprit BOOST_PYTHON_MODULE laissait entre les accolades la portée d'un espace de noms, donc j'ai inclus ces en-têtes dans ça, jusqu'ici j'ai 96 erreurs boost :: python, mais je pense que c'est un début – lj8888

0
expected ';' before 'template' 
expected primary-expression before 'template' 

Vous avez oublié un point-virgule avant la première ligne. Pouvez-vous donner la ligne précédente?

+0

comme je l'ai dit, il y a seulement inclus, mais là vous allez: #include #include en utilisant l'espace de nommage boost :: python; en utilisant l'espace de noms cml; #include #include template std :: string repr_vector_dynamic (const VectorType * vect) – lj8888

+0

il n'y a pas manque ';' avant cela – lj8888

+0

Pouvez-vous donner la ligne de commande que vous avez utilisée? Est-ce le seul fichier? –

0

Peut-être que vous devriez utiliser g++, le compilateur C++, au lieu de gcc, le compilateur C.

Une autre possibilité est que l'un de vos en-têtes a #define d une macro vraiment mal.

+0

gcc s'exécutera en mode C++ si le fichier a une extension C++. Et si cela a été compilé en tant que C, vous obtiendrez une erreur très différente. –

1

Comme d'autres l'ont suggéré, c'est ce qui vient avant la déclaration template qui manque le ;.

Jetez un oeil à ce que le compilateur voit donc:

g++ -E <yourfile>.cpp | less

+0

J'ai essayé votre idée, j'ai dû supprimer tous les inclusions car le fichier devenait trop long: g ++ -E vector.h/* mine est un fichier d'en-tête */-I > test.txt mais comme je l'ai dit, le modèle précédent ne sont comprend: #include #include template std :: string repr_vector_dynamic (const VectorType * vect) {@ – lj8888

+1

lj8888: le point est vous avez besoin de voir ce que les en-têtes ont étendu à après le pré-traitement afin que vous ne supprimiez rien, sinon vous invalider ce test particulier. Aussi, ne l'exécutez pas sur le fichier d'en-tête, exécutez-le simplement sur le fichier source qui ne sera pas compilé. Plutôt que '| less' vous pouvez simplement le rediriger vers un fichier en utilisant '> yourfile.ii' si vous le souhaitez. Vous pouvez ensuite rechercher dans ce fichier en utilisant votre éditeur de texte favori pour trouver votre modèle de fonction 'repr_vector_dynamic' et voir _exactement_ ce qui est sur les lignes précédentes maintenant que tous les en-têtes et macros ont été remplacés par du contenu réel. – Troubadour

+0

si je l'exécute sur le fichier .cpp je reçois seulement les erreurs g ++, que j'ai ajouté dans l'édition, si je cours le -E sur l'en-tête, la taille du fichier est énorme, adn repr_vector_dynamic ne peut pas trouver en recherchant – lj8888