2

yaml-cppRAD 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 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_tで同じですunsigned。つまり、コンパイラは、std::size_tunsignedはテンプレート引数の推定(is_same_type::value == false)に対して異なる型であると考えていましたが、型の推定は後で同じ型であることが判明std::size_tし、エラーが発生しました。unsignedunsigend 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 に答える