Вопрос

Я не могу скомпилировать 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 Can Compile 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.

Это было полезно?

Решение

Пробуя свой код с помощью кодовых блоков, проблемы показали ровно наоборот. Это означает, что мой код компилирует с

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> и компилятор жаловался.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top