質問

コンパイルできません 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_tunsigned. 。つまり、コンパイラがそれを考えたことを意味します std::size_tunsigned テンプレート引数控除の異なるタイプです(is_same_type::value == false)、しかし、タイプの控除は後で見つかりました std::size_tunsigned 同じタイプになります 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> そして、コンパイラは不平を言いました。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top