Erreur yaml-cpp compiler dans RAD Studio 2010
-
24-09-2019 - |
Question
Je ne peux pas compiler yaml-cpp
dans RAD Studio 2010. J'ai erreur dans 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
print compilateur:
[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>'
Je pense que tout correct - dans la ligne 24 je suis arrivé
is_index_type_with_check<std::size_t, false>
,
dans la ligne 30, je suis
is_index_type_with_check<unsigned, true>
.
Deux types différents.
Mais si je change la ligne 24 comme ci-dessous, RAD Studio peut compiler yaml-cpp
template <> struct is_index_type_with_check<std::size_t, true> { enum { value = true }; }; // false -> true
Pourquoi ?! Dans la ligne 24, je suis
is_index_type_with_check<std::size_t, true>
et dans la ligne 30
is_index_type_with_check<unsigned, true>
Deux types identique. Mais tous les travaux dans RAD Studio et ne pas MS VS 2008 Express.
La solution
Essayer votre code avec CodeBlocks, les problèmes ont montré exactement vice-versa. Cela signifie que mon code compile avec
template <> struct is_index_type_with_check<std::size_t, false>
et échoue avec
template <> struct is_index_type_with_check<std::size_t, true>
à la ligne 24.
Le problème semble être que des compilateurs types pensent sont les mêmes et qui sont différents. Ce problème se répand sur les différentes phases du processus de compilation. Regardez à nouveau votre erreur du compilateur. Les arguments de modèle de is_index_type_with_check
sont les mêmes pour les deux std::size_t
et unsigned
. Cela signifie que votre compilateur pense que std::size_t
et unsigned
sont différents types de déduction des arguments de modèle (is_same_type::value == false
), mais la déduction de type découvert par la suite std::size_t
et unsigned
être du même type unsigend int
et se plaint d'une erreur.
Donc, pour résumer, vous ne l'avez pas lu votre erreur de compilateur correctement - MAKE_INDEX_TYPE(unsigned);
a créé un is_index_type_with_check<unsigned int, false>
. Ce type en conflit avec votre template <> struct is_index_type_with_check<std::size_t, false>
et le compilateur se plaint.