Errore compila Yaml-CPP in Rad Studio 2010
-
24-09-2019 - |
Domanda
Non riesco a compilare yaml-cpp
In Rad Studio 2010. Ho un errore in 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
Stampa del compilatore:
[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>'
Penso che tutto corretto - nella riga 24 ho ottenuto
is_index_type_with_check<std::size_t, false>
,
nella riga 30 che ho ottenuto
is_index_type_with_check<unsigned, true>
.
Due tipi diversi.
Ma se cambio la riga 24 come sotto, Rad Studio può compilare yaml-cpp
template <> struct is_index_type_with_check<std::size_t, true> { enum { value = true }; }; // false -> true
Perché?! Nella riga 24 che ho ottenuto
is_index_type_with_check<std::size_t, true>
e nella riga 30
is_index_type_with_check<unsigned, true>
Due digitali identici. Ma tutto funziona in Rad Studio e non è in MS vs 2008 Express.
Soluzione
Provando il tuo codice con Codeblocks, i problemi hanno mostrato esattamente viceversa. Ciò significa che il mio codice si compila con
template <> struct is_index_type_with_check<std::size_t, false>
e fallisce con
template <> struct is_index_type_with_check<std::size_t, true>
nella riga 24.
Il problema sembra essere, quali tipi i compilatori pensano siano gli stessi e che siano diversi. Questo problema si diffonde su diverse fasi del processo di compilazione. Guarda di nuovo l'errore del tuo compilatore. Gli argomenti del modello di is_index_type_with_check
sono gli stessi per entrambi std::size_t
e unsigned
. Ciò significa che il tuo compilatore lo ha pensato std::size_t
e unsigned
sono diversi tipi per la detrazione dell'argomento modello (is_same_type::value == false
), ma la detrazione del tipo successivamente ha trovato std::size_t
e unsigned
per essere dello stesso tipo unsigend int
e si lamenta con un errore.
Quindi, per riassumere non hai letto correttamente il tuo errore del compilatore - MAKE_INDEX_TYPE(unsigned);
creato un is_index_type_with_check<unsigned int, false>
. Quel tipo si scontrò con il tuo template <> struct is_index_type_with_check<std::size_t, false>
E il compilatore si è lamentato.