خطأ yaml-CPP ترجمة في Rad Studio 2010
-
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>
.
نوعان مختلفان.
ولكن إذا قمت بتغيير السطر 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>
واشتكى المترجم.