Frage

Ich kann nicht kompilieren yaml-cpp In RAD Studio 2010. Ich habe Fehler 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

Compiler -Druck:

[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>'

Ich denke, dass alles richtig - in Zeile 24 habe ich bekommen

is_index_type_with_check<std::size_t, false>,

In Zeile 30 bekam ich

is_index_type_with_check<unsigned, true>.

Zwei verschiedene Typen.

Aber wenn ich die Linie 24 wie unten ändere, kann Rad Studio kompilieren yaml-cpp

template <> struct is_index_type_with_check<std::size_t, true> { enum { value = true }; }; // false -> true

Warum?! In Zeile 24 bekam ich

is_index_type_with_check<std::size_t, true>

und in Zeile 30

is_index_type_with_check<unsigned, true>

Zwei identisch Typ. Aber alle Arbeiten in Rad Studio und nicht in MS vs 2008 Express.

War es hilfreich?

Lösung

Wenn Sie Ihren Code mit Codeblocks ausprobieren, zeigten die Probleme genau umgekehrt. Das bedeutet, dass mein Code mit kompiliert

template <> struct is_index_type_with_check<std::size_t, false>

und scheitert mit

template <> struct is_index_type_with_check<std::size_t, true>

in Zeile 24.

Das Problem scheint zu sein, welche Typen Compiler halten und welche unterschiedlich sind. Dieses Problem verbreitet sich über verschiedene Phasen des Kompiliervorgangs. Schauen Sie sich Ihren Compiler -Fehler erneut an. Die Vorlagenargumente von is_index_type_with_check sind für beide gleich std::size_t und unsigned. Das heißt, dass Ihr Compiler das dachte std::size_t und unsigned sind verschiedene Typen für den Abzug von Vorlagenargument (is_same_type::value == false), aber der Typabzug später gefunden std::size_t und unsigned vom gleichen Typ sein unsigend int und beschwert sich mit einem Fehler.

Zusammenfassend Sie haben Ihren Compiler -Fehler nicht richtig gelesen - MAKE_INDEX_TYPE(unsigned); erstellt an is_index_type_with_check<unsigned int, false>. Dieser Typ kollidierte mit Ihrem template <> struct is_index_type_with_check<std::size_t, false> und der Compiler beschwerte sich.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top