Rad Studio 2010でエラーYAML-CPPコンパイル
-
24-09-2019 - |
質問
コンパイルできません 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>
.
2つの異なるタイプ。
ただし、以下のように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>
2つの同じタイプ。しかし、すべてがRADスタジオで機能し、MS対2008 Expressでは機能しません。
解決
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_t
と unsigned
. 。つまり、コンパイラがそれを考えたことを意味します std::size_t
と unsigned
テンプレート引数控除の異なるタイプです(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>
そして、コンパイラは不平を言いました。