Erro YAML-CPP Compile no RAD Studio 2010
-
24-09-2019 - |
Pergunta
Eu não posso compilar yaml-cpp
no Rad Studio 2010. Tenho erro em 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
Impressão do compilador:
[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>'
Eu acho que tudo correto - na linha 24 eu tenho
is_index_type_with_check<std::size_t, false>
,
Na linha 30 eu tenho
is_index_type_with_check<unsigned, true>
.
Dois tipos diferentes.
Mas se eu mudar a linha 24, como abaixo, o Rad Studio pode compilar yaml-cpp
template <> struct is_index_type_with_check<std::size_t, true> { enum { value = true }; }; // false -> true
Por que?! Na linha 24 eu tenho
is_index_type_with_check<std::size_t, true>
e na linha 30
is_index_type_with_check<unsigned, true>
Dois tipos idênticos. Mas tudo funciona no Rad Studio e não no MS vs 2008 Express.
Solução
Experimentando seu código com os blocos de código, os problemas mostraram exatamente vice -versa. Isso significa que meu código compila com
template <> struct is_index_type_with_check<std::size_t, false>
e falha com
template <> struct is_index_type_with_check<std::size_t, true>
na linha 24.
O problema parece ser, quais tipos os compiladores pensam que são iguais e que são diferentes. Esse problema se espalha por diferentes fases do processo de compilação. Olhe novamente para o seu erro do compilador. Os argumentos do modelo de is_index_type_with_check
são os mesmos para ambos std::size_t
e unsigned
. Isso significa que seu compilador pensou que std::size_t
e unsigned
são tipos diferentes para dedução do argumento de modelo (is_same_type::value == false
), mas a dedução do tipo encontrou posteriormente std::size_t
e unsigned
para ser do mesmo tipo unsigend int
e reclama com um erro.
Então, para resumir, você não leu seu erro de compilador corretamente - MAKE_INDEX_TYPE(unsigned);
criou um is_index_type_with_check<unsigned int, false>
. Esse tipo entrou em conflito com o seu template <> struct is_index_type_with_check<std::size_t, false>
e o compilador reclamou.