首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >来自yaml-cpp的编译器错误

来自yaml-cpp的编译器错误
EN

Stack Overflow用户
提问于 2010-06-27 19:03:17
回答 2查看 1.8K关注 0票数 0

我正试图将yaml-cpp整合到一个项目中,但我看到GCC犯了一些意想不到的错误。例如:

代码语言:javascript
复制
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

另一个例子是:

代码语言:javascript
复制
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的一个问题,但经验告诉我,可能是我的错。有什么想法吗?

更新

H文件包含以下内容:

代码语言:javascript
复制
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包含:

代码语言:javascript
复制
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;
        }
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-08-02 12:27:08

你好像在里面包括地狱。你发布的traits.h文件中没有“(”),但是gcc抱怨“(”)之前的内容。这可能意味着您所包含的宏的名称与此文件中的内容相同。尝试重新排序项目中的包含,看看它是否有任何不同。

票数 1
EN

Stack Overflow用户

发布于 2010-06-28 20:01:16

我建议您尝试删除“使用命名空间X;”--特别是在X == YAML中。这样,您的错误信息可能会变得更有洞察力--因为看起来您的名称冲突很大。另一个窍门是查看预处理器所吐出的内容--使用G++,您可以使用-E (而不是-c)运行编译行,并将输出输送到文件中。然后,您可以看到编译器得到了什么(而不是原始源,或者预处理程序得到了什么)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3128497

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档