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

Posted

技术标签:

【中文标题】RAD Studio 2010 中的错误 yaml-cpp 编译【英文标题】:Error yaml-cpp compile in RAD Studio 2010 【发布时间】:2010-03-05 12:13:38 【问题描述】:

我无法在 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&lt;unsigned int,0&gt;'

[BCC32 Error] nodeutil.h(24): E2344 Earlier declaration of 'is_index_type_with_check&lt;unsigned int,0&gt;'

我认为所有正确 - 在第 24 行我得到了

is_index_type_with_check&lt;std::size_t, false&gt;,

在第 30 行我得到了

is_index_type_with_check&lt;unsigned, true&gt;

两种不同的类型。

但如果我像下面这样更改第 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&lt;std::size_t, true&gt;

在第 30 行

is_index_type_with_check&lt;unsigned, true&gt;

两个相同的类型。但所有这些都可以在 RAD Studio 中运行,而不能在 MS VS 2008 Express 中运行。

【问题讨论】:

你想在问题的最后一个块中写std::size_t, true 我写这个。但我不明白两件事 - 为什么第一选择是错误的,为什么第二选择有效。我认为这与 SFINAE 相关,但在我的系统中 std::size_t 等于 unsigned int 【参考方案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_tunsigned 是模板参数推导的不同类型(is_same_type::value == false),但类型推导后来发现std::size_tunsigned 属于同一类型unsigend int并报错。

所以总结一下,您没有正确读取编译器错误 - MAKE_INDEX_TYPE(unsigned); 创建了一个 is_index_type_with_check&lt;unsigned int, false&gt;。该类型与您的template &lt;&gt; struct is_index_type_with_check&lt;std::size_t, false&gt; 冲突,编译器抱怨。

【讨论】:

以上是关于RAD Studio 2010 中的错误 yaml-cpp 编译的主要内容,如果未能解决你的问题,请参考以下文章

C++Builder (RAD Studio) 中的范围检查错误

RAD Studio 10 安装失败 提示错误 License status check failure解决办法

如何更改 RAD Studio(2010 及更高版本)IDE 格式化我的代码的方式?

rad studio 11可以打开c++builder6.0的工程吗

装delphi2010,用)RAD Studio 2010 V14.3615 iso ,为啥我用Delphi.Distiller.v1.85破解工具破解不了,

尝试在 XE 中访问 RAD Studio 10.2 编译库时出现链接错误