سؤال

لا أستطيع التجميع 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 تجميع 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 ولا في MS VS 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> واشتكى المترجم.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top