Le bout de code suivant:
typedef map < Str, Str, less < Str > > Table;
me donne l'erreur de compilation suivante:
parse error before `<'
Je ne sais pas du tout ce que celà siginfie. Quelqu'un peut-il m'aider?
Merci d'avance.
Version imprimable
Le bout de code suivant:
typedef map < Str, Str, less < Str > > Table;
me donne l'erreur de compilation suivante:
parse error before `<'
Je ne sais pas du tout ce que celà siginfie. Quelqu'un peut-il m'aider?
Merci d'avance.
Erreur de syntaxe. Probablement qu'un identifiant n'est pas défini. Sans quelques lignes de code en plus, je ne peux pas t'aider plus.
Ce ne serait pas juste une question de std:: ?
Code:typedef std::map < Str, Str, std::less < Str > > Table;
Cette fois-ci, je donne un peu plus de code:
Selenite: Je pense que Str est défini par str.h.Code:
1
2
3
4
5
6
7
8
9
10
11
12
13 #include "str.h" using namespace std; class PropertyTbl { public: typedef map < Str, Str, less < Str > > Table; typedef Table::iterator Iter; typedef Table::const_iterator C_Iter; typedef const Str& Key; typedef Str Value;
YéTeeh: compte-tenu du namespace std, je ne pense pas que le problème vienne de là.
Je rajoute une question à la première. Si j'ai bien compris, "less" est un mot clé. Mais à quoi sert ce troisième type d'éléments du tableau?
Rajoute #include <map>.
less n'est pas un mot clef, c'est un foncteur qui pourrait être défini ainsi:
Tu n'est pas obiligé de mettre le 3eme argument de modèle.Code:
1
2
3
4
5 template<class T>class less { bool operator() (T& a, T& b) { return a < b; } }
Le include y est déjà.
Avec un compilateur plus récent, voici ce que j'obtiens:
ISO C++ forbids declaration of `map' with no type
error: expected `;' before '<' token
pour la ligne commençant par: "typedef map...
cf plus haut, map fait partie du namespace std, tu dois donc l'indiquer :
en debut de fichier :
using namespace std; // std pour tout le monde ( open() reste accessible par ::open(), par exemple)
a chaque appel :
std::map ...
J'ai essayé mais çà change rien à la compilation...
essaye un map<int,int>
puis un map<string,string> (string def dans <string>, c'est quoi Str, un truc a toi ?)
puis un map< string , string , less<string> >
...
fais bien gaffe aux espaces autour de less<string> pour separer les >
EDIT :Code:map<a,b> est-i-il identique a map <a,b> ?
Je me demande si cela ne viens pas de mon compilateur.
C'est gcc version 2.7.2.3 ...
Ca a l'air assez vieux en effet. Pour s'en assurer il suffit de voir si ce code minimal compile ou non chez toi :Citation:
Envoyé par C_R
Dans tous les cas, mettre à jour ton compilo ne serait pas une mauvaise idée.Code:
1
2
3
4
5
6
7 #include <map> int main() { std::map<int, int> m; return 0; }
Effectivement, il commence à se faire vieux ...
Ca a pas l'air super simple de mettre à jour son compilo?
Pour le bout de code à tester en compilation,est-ce normal que ça marche avec une commande g++ et que çà me donne ce qui suit avec la commance gcc:
Citation:
In file included from /usr/include/g++/stl_tree.h:56,
from /usr/include/g++/map:31,
from test.cpp:1:
/usr/include/g++/stl_algobase.h:52: new.h: No such file or directory
In file included from /usr/include/g++/stl_tree.h:58,
from /usr/include/g++/map:31,
from test.cpp:1:
/usr/include/g++/stl_construct.h:34: new.h: No such file or directory
Bien sûr, gcc sert à compiler du C et g++ du C++.
OK
Mais j'imagine que gcc switche de lui-même à g++ quand il voit l'extension cpp? Non?
Non, justement.
Pour ceux qui prennent le thread en route.
Voici mon code:
que je compile avec g++ 2.7.2.3. Ce qui me donne les messages suivantsCode:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27 #ifndef __CONFIG_H #define __CONFIG_H #include <stdio.h> #ifdef _WIN32 # ifdef _MSC_VER # pragma warning(disable:4786) # endif # include <map> using namespace std; #endif #ifdef _LINUX # include <map> #endif #include "str.h" using namespace std; class PropertyTbl { public: typedef map<Str, Str, less<Str> > Table; typedef Table::iterator Iter; typedef Table::const_iterator C_Iter;
Je voudrais surtout comprendre la première erreur.Citation:
`less' was not declared in this scope
parse error before `>'
warning: ANSI C++ forbids typedef which does not specify a type
parse error before `::'
`int' is not an aggregate type
warning: ANSI C++ forbids typedef which does not specify a type
confused by earlier errors, bailing out
Inclus le header fuctional:
Et de toute façon,Code:#include <functional>
est équivalent puisque le type pas défaut sera, dans ce cas, less<Str>Code:typedef map<Str, Str> Table;
Voici le bout de code modifié:
et voici les messages du compilo:Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14 #include "str.h" using namespace std; #include <functional> class PropertyTbl { public: typedef std::map< Str, Str > Table; typedef Table::iterator Iter; typedef Table::const_iterator C_Iter; typedef const Str& Key; typedef Str Value;
Je comprend pas. Je ne vois pas ce qui foire. Arrêter moi si je me trompe :Citation:
error: ISO C++ forbids declaration of `map' with no type
error: template-id `map<Str, Str>' used as a declarator
error: parse error before `;' token
error: ISO C++ forbids declaration of `Table' with no type
error: parse error before `::' token
error: `int' is not an aggregate type
error: ISO C++ forbids declaration of `const_iterator' with no
crée une spécialisation du template map. C'est donc sensé être un type et non un template-id.Code:std::map< Str, Str >
Merci de votre aide, d'avance.
Dans cet ordre là, ce n'est jamais bon...Code:
1
2
3 using namespace std; #include <functional>
Le code minimal donné précédemment avec simplement une déclaration de map<int, int> compilait-il chez toi ?
Oui, Oui, çà compilait
J'ai inversé les deux lignes mais les messages sont les mêmes à la compilation...
Dans ce cas, si tu sortais #include <map> des directives de préprocesseur, vu que ça ne dépend pas du système ?
En l'occurence je pense que tu compiles sous Linux et que _LINUX n'est pas défini (de mémoire je crois que c'est __linux__ qui est défini).
Ca va dans le bon sens...
Ca m'a enlevé un tas d'erreurs...
Ou sont définis ces constantes? Comment aurais-je pu savoir?
Je marque ce thread résolu ensuite. Merci beaucoup :D
Généralement pour connaître les constantes définies par les différents systèmes, il faut jeter un oeil aux en-têtes de configuration des bibliothèques portables (genre boost), on y trouve à peu près tout.