2010-06-27 11 views
0

J'essaie d'intégrer yaml-cpp dans un projet, mais je vois des erreurs inattendues dans GCC. Par exemple:Erreur de compilation provenant de yaml-cpp

g++ -c -ggdb3 -ansi -Wall -Werror -pedantic-errors src/commands-tz.cpp -o obj/commands-tz.o 
In file included from /usr/local/include/yaml-cpp/conversion.h:9, 
       from /usr/local/include/yaml-cpp/node.h:8, 
       from /usr/local/include/yaml-cpp/parser.h:8, 
       from /usr/local/include/yaml-cpp/yaml.h:8, 
       from src/note.h:26, 
       from src/commands-tz.cpp:297: 
/usr/local/include/yaml-cpp/traits.h:26: error: expected identifier before ‘(’ token 
/usr/local/include/yaml-cpp/traits.h:26: error: expected ‘)’ before numeric constant 
/usr/local/include/yaml-cpp/traits.h:26: error: expected ‘>’ before numeric constant 
/usr/local/include/yaml-cpp/traits.h:26: error: expected unqualified-id before ‘)’ token 
/usr/local/include/yaml-cpp/traits.h:31: error: expected identifier before ‘(’ token 
/usr/local/include/yaml-cpp/traits.h:31: error: expected ‘)’ before numeric constant 
/usr/local/include/yaml-cpp/traits.h:31: error: expected ‘>’ before numeric constant 
/usr/local/include/yaml-cpp/traits.h:31: error: expected unqualified-id before ‘)’ token 
/usr/local/include/yaml-cpp/traits.h:34: error: expected identifier before ‘(’ token 
/usr/local/include/yaml-cpp/traits.h:34: error: expected ‘)’ before numeric constant 
/usr/local/include/yaml-cpp/traits.h:34: error: expected ‘>’ before numeric constant 
/usr/local/include/yaml-cpp/traits.h:34: error: expected unqualified-id before ‘)’ token 
/usr/local/include/yaml-cpp/traits.h:37: error: expected identifier before ‘(’ token 
/usr/local/include/yaml-cpp/traits.h:37: error: expected ‘)’ before numeric constant 
/usr/local/include/yaml-cpp/traits.h:37: error: expected ‘>’ before numeric constant 
/usr/local/include/yaml-cpp/traits.h:37: error: expected unqualified-id before ‘)’ token 
/usr/local/include/yaml-cpp/traits.h:42: error: expected identifier before ‘(’ token 
/usr/local/include/yaml-cpp/traits.h:42: error: expected ‘)’ before numeric constant 
/usr/local/include/yaml-cpp/traits.h:42: error: expected ‘>’ before numeric constant 
/usr/local/include/yaml-cpp/traits.h:42: error: expected unqualified-id before ‘)’ token 
/usr/local/include/yaml-cpp/traits.h:45: error: expected identifier before ‘(’ token 
/usr/local/include/yaml-cpp/traits.h:45: error: expected ‘)’ before numeric constant 
/usr/local/include/yaml-cpp/traits.h:45: error: expected ‘>’ before numeric constant 
/usr/local/include/yaml-cpp/traits.h:45: error: expected unqualified-id before ‘)’ token 

Un autre exemple:

In file included from /usr/local/include/yaml-cpp/nodeimpl.h:8, 
       from /usr/local/include/yaml-cpp/node.h:139, 
       from /usr/local/include/yaml-cpp/parser.h:8, 
       from /usr/local/include/yaml-cpp/yaml.h:8, 
       from src/note.h:26, 
       from src/commands-tz.cpp:297: 
/usr/local/include/yaml-cpp/nodeutil.h:9: error: expected nested-name-specifier before ‘(’ token 
/usr/local/include/yaml-cpp/nodeutil.h:9: error: expected ‘)’ before numeric constant 
/usr/local/include/yaml-cpp/nodeutil.h:9: error: expected ‘>’ before numeric constant 
/usr/local/include/yaml-cpp/nodeutil.h:9: error: expected unqualified-id before ‘)’ token 
/usr/local/include/yaml-cpp/nodeutil.h:14: error: expected nested-name-specifier before ‘(’ token 
/usr/local/include/yaml-cpp/nodeutil.h:14: error: expected ‘)’ before numeric constant 
/usr/local/include/yaml-cpp/nodeutil.h:14: error: expected ‘>’ before numeric constant 
/usr/local/include/yaml-cpp/nodeutil.h:14: error: expected unqualified-id before ‘)’ token 
/usr/local/include/yaml-cpp/nodeutil.h:19: error: expected nested-name-specifier before ‘(’ token 
/usr/local/include/yaml-cpp/nodeutil.h:19: error: expected ‘)’ before numeric constant 
/usr/local/include/yaml-cpp/nodeutil.h:19: error: expected ‘>’ before numeric constant 
/usr/local/include/yaml-cpp/nodeutil.h:19: error: expected unqualified-id before ‘)’ token 
/usr/local/include/yaml-cpp/nodeutil.h:24: error: ‘is_index_type_with_check’ is not a template 
/usr/local/include/yaml-cpp/nodeutil.h:24: error: explicit specialization of non-template ‘YAML::is_index_type_with_check’ 

Ma plate-forme est Fedora (2.6.32 noyau), GCC 4.4.1, et YAML-cpp 0.2.5. Il y a beaucoup, beaucoup d'autres erreurs. À l'œil nu, cela semble être un problème dans yaml-cpp, mais l'expérience me dit que je suis probablement le seul responsable. Des idées?

MISE À JOUR

Le traits.h fichier contient les éléments suivants:

namespace YAML 
{ 
     template <typename> 
     struct is_numeric { enum { value = false }; }; 

     template <> struct is_numeric <char> { enum { value = true }; }; 
     template <> struct is_numeric <unsigned char> { enum { value = true }; }; 
     template <> struct is_numeric <int> { enum { value = true }; }; 
     template <> struct is_numeric <unsigned int> { enum { value = true }; }; 
     template <> struct is_numeric <long int> { enum { value = true }; }; 
     template <> struct is_numeric <unsigned long int> { enum { value = true }; }; 
     template <> struct is_numeric <short int> { enum { value = true }; }; 
     template <> struct is_numeric <unsigned short int> { enum { value = true }; }; 
     template <> struct is_numeric <long long> { enum { value = true }; }; 
     template <> struct is_numeric <unsigned long long> { enum { value = true }; }; 
     template <> struct is_numeric <float> { enum { value = true }; }; 
     template <> struct is_numeric <double> { enum { value = true }; }; 
     template <> struct is_numeric <long double> { enum { value = true }; }; 

     template <bool, class T = void> 
     struct enable_if_c { 
      typedef T type; 
     }; 

     template <class T> 
     struct enable_if_c<false, T> {}; 

     template <class Cond, class T = void> 
     struct enable_if : public enable_if_c<Cond::value, T> {}; 

     template <bool, class T = void> 
     struct disable_if_c { 
      typedef T type; 
     }; 

     template <class T> 
     struct disable_if_c<true, T> {}; 

     template <class Cond, class T = void> 
     struct disable_if : public disable_if_c<Cond::value, T> {}; 
} 

Et nodeutil.h contient:

namespace YAML 
{ 
     template <typename T, typename U> 
     struct is_same_type { 
       enum { value = false }; 
     }; 

     template <typename T> 
     struct is_same_type<T, T> { 
       enum { value = true }; 
     }; 

     template <typename T, bool check> 
     struct is_index_type_with_check { 
       enum { value = false }; 
     }; 

     template <> struct is_index_type_with_check<std::size_t, false> { enum { value = true }; }; 

#define MAKE_INDEX_TYPE(Type) \ 
     template <> struct is_index_type_with_check<Type, is_same_type<Type, std::size_t>::value> { enum { value = true }; } 

     MAKE_INDEX_TYPE(int); 
     MAKE_INDEX_TYPE(unsigned); 
     MAKE_INDEX_TYPE(short); 
     MAKE_INDEX_TYPE(unsigned short); 
     MAKE_INDEX_TYPE(long); 
     MAKE_INDEX_TYPE(unsigned long); 

#undef MAKE_INDEX_TYPE 

     template <typename T> 
     struct is_index_type: public is_index_type_with_check<T, false> {}; 

     // messing around with template stuff to get the right overload for operator [] for a sequence 
     template <typename T, bool b> 
     struct _FindFromNodeAtIndex { 
       const Node *pRet; 
       _FindFromNodeAtIndex(const Node&, const T&): pRet(0) {} 
     }; 

     template <typename T> 
     struct _FindFromNodeAtIndex<T, true> { 
       const Node *pRet; 
       _FindFromNodeAtIndex(const Node& node, const T& key): pRet(node.FindAtIndex(static_cast<std::size_t>(key))) {} 
     }; 

     template <typename T> 
     inline const Node *FindFromNodeAtIndex(const Node& node, const T& key) { 
       return _FindFromNodeAtIndex<T, is_index_type<T>::value>(node, key).pRet; 
     } 
} 
+0

De quel code les lignes provoquant l'erreur contiennent-elles? (Autour de la ligne 26 de traits.h et de la ligne 9 de nodeutil.h) – Kleist

+1

Vous semblez être à l'intérieur inclure l'enfer. Le fichier traits.h que vous avez posté contient * no * '(', mais gcc se plaint de ce qui vient avant un '(') Cela pourrait signifier que vous incluez quelque chose qui a une macro avec le même nom que quelque chose dans ce fichier. réorganiser les inclusions dans votre projet et voir si cela fait une différence – Gianni

+0

@Gianni: Il a été inclus l'enfer d'accord.Je ne suis pas sûr comment cela fonctionne, mais le fichier "note.h" comprend Dans une mise en œuvre Fichier de configuration [src/commands-tz.cpp] I #include "note.h" et GCC est mort. Si j'ajoute (* avant * cela inclut) un #include , alors tout fonctionne juste dandy. Je ne peux pas le comprendre, mais merci pour le conseil! (republier comme une réponse pour que je puisse le marquer?) –

Répondre

1

Vous semblez être à l'intérieur inclure l'enfer. Le fichier traits.h que vous avez posté ne contient aucun '(', mais gcc se plaint de ce qui vient avant un '('. '' Cela pourrait signifier que vous incluez quelque chose qui a une macro avec le même nom que quelque chose dans ce fichier. inclus dans votre projet et voir si cela fait une différence

0

Je vous suggère essayez de supprimer « en utilisant l'espace de noms X " - en particulier où X == YAML. Vos messages d'erreur peuvent devenir plus perspicaces de cette façon - car il semble que vous ayez des conflits de noms. Une autre astuce consiste à voir ce que le préprocesseur crache: avec G ++, vous pouvez exécuter votre ligne de compilation avec -E (au lieu de -c) et diriger la sortie vers un fichier. Ensuite, vous pouvez voir ce que le compilateur obtient (plutôt que la source d'origine, ou ce que le préprocesseur obtient).