2

我无法yaml-cpp在 RAD Studio 2010 中编译。我有错误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 中使用。

4

1 回答 1

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_check是相同std::size_tunsigned。这意味着,您的编译器认为std::size_tandunsigned是模板参数推导 ( is_same_type::value == false) 的不同类型,但后来发现类型推导std::size_t并且unsigned是相同类型unsigend int并报错。

所以总结一下,你没有正确阅读你的编译器错误——MAKE_INDEX_TYPE(unsigned);创建了一个is_index_type_with_check<unsigned int, false>. 该类型与您发生冲突,template <> struct is_index_type_with_check<std::size_t, false>编译器抱怨。

于 2010-06-04T18:21:24.917 回答