Compiler error coming out of yaml-cpp
我正在尝试将yaml-cpp集成到项目中,但是我发现GCC出现了一些意外错误。 例如:
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 28 29 30 31 | 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 |
另一个例子:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | 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’ |
我的平台是Fedora(2.6.32内核),GCC 4.4.1和yaml-cpp 0.2.5。 还有很多很多其他错误。 肉眼看,这似乎在yaml-cpp中是个问题,但是经验告诉我,我可能是有过错的人。 有任何想法吗?
更新
文件traits.h包含以下内容:
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 28 29 30 31 32 33 34 35 36 37 38 39 40 41 | 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> {}; } |
并且nodeutil.h包含:
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 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 | 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; } } |
您似乎在其中包括地狱。 您发布的traits.h文件不包含'(',但gcc抱怨'('之前的内容。这可能意味着您要包含的文件中包含与此文件同名的宏。 包括在您的项目中,看看是否有任何不同。
我建议您尝试删除"使用命名空间X;"。 -特别是在X == YAML的情况下。 这样一来,您的错误消息可能会变得更有见识-好像您的名称发生冲突。 另一个技巧是查看预处理器吐出的内容-使用G ++,您可以使用-E(而不是-c)运行编译行并将输出管道传输到文件。 然后,您可以看到编译器正在获取什么(而不是原始源或预处理器正在获取什么)。