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.

Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top