在RAD Studio 2010中编译错误yaml-cpp

时间:2010-03-05 12:13:38

标签: c++ templates yaml c++builder yaml-cpp

我无法在RAD Studio 2010中编译yaml-cpp。我在nodeutil.h

中有错误
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 }; }; // line 24

#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); // line 30
MAKE_INDEX_TYPE(short);
MAKE_INDEX_TYPE(unsigned short);
MAKE_INDEX_TYPE(long);
MAKE_INDEX_TYPE(unsigned long);
#undef MAKE_INDEX_TYPE

编译器打印:

[BCC32 Error] nodeutil.h(30): E2238 Multiple declaration for 'is_index_type_with_check<unsigned int,0>'

[BCC32 Error] nodeutil.h(24): E2344 Earlier declaration of 'is_index_type_with_check<unsigned int,0>'

我认为一切正确 - 在第24行我得到了

is_index_type_with_check<std::size_t, false>

第30行我得到

is_index_type_with_check<unsigned, true>

两种不同的类型。

但如果我改变第24行,RAD Studio可以编译yaml-cpp

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

为什么?在第24行我得到了

is_index_type_with_check<std::size_t, true>

和第30行

is_index_type_with_check<unsigned, true>

两个相同的类型。但是所有工作都在RAD Studio中,而不是在MS VS 2008 Express中。

1 个答案:

答案 0 :(得分:1)

使用CodeBlocks尝试使用代码,问题显示反之亦然。这意味着,我的代码用

编译
template <> struct is_index_type_with_check<std::size_t, false>

并以

失败
template <> struct is_index_type_with_check<std::size_t, true>
第24行

问题似乎是,编译器认为哪些类型是相同的,哪些是不同的。此问题在编译过程的不同阶段传播。再看一下你的编译器错误。 is_index_type_with_checkstd::size_t的{​​{1}}模板参数相同。这意味着,您的编译器认为unsignedstd::size_t是模板参数推导的不同类型(unsigned),但后来发现类型推导is_same_type::value == false和{{1} }是同一类型std::size_t并抱怨错误。

总而言之,您没有正确读取编译器错误 - unsigned创建了unsigend int。那种类型与你的MAKE_INDEX_TYPE(unsigned);冲突,编译器抱怨。