2015-12-07 7 views
5

cerco di includere questo fileerrore di ridefinizione in file di intestazione sistema a causa di "signed char" e "char"

boost/assign/list_of.hpp 

ma ho l'errore di questo compilatore

/usr/include/boost/type_traits/is_integral.hpp:38: error: redefinition of struct boost::is_integral<char> 
/usr/include/boost/type_traits/is_integral.hpp:32: error: previous definition of struct boost::is_integral<char> 

queste righe definizioni (32 , 38) nel file is_integral.hpp sono:

BOOST_TT_AUX_BOOL_TRAIT_CV_SPEC1(is_integral,signed char,true) 
BOOST_TT_AUX_BOOL_TRAIT_CV_SPEC1(is_integral,char,true) 

come risolvere il problema di compilazione? il compilatore gcc è la versione 4.4.7 20.120.313 OS è Red Hat Enterprise Linux Server versione 6.5 (Santiago)

+2

Perché dobbiamo chiedere un MCVE ogni volta? –

+0

IOW, avremo bisogno che tu ci mostri la definizione di macro "BOOST_TT_AUX_BOOL_TRAIT_CV_SPEC1' * anche nella domanda *. Grazie. –

+0

Non lo facciamo, @lightness, puoi semplicemente contrassegnare la domanda come off-topic. –

risposta

2

Da C++ standard,

3.9.1 tipi fondamentali [basic.fundamental]

oggetti dichiarati come caratteri (char) deve essere grande abbastanza per memorizzare qualsiasi membro del set di caratteri di base dell'implementazione. Se un personaggio di questo insieme è memorizzato in un oggetto personaggio, il valore integrale di quell'oggetto personaggio è uguale al valore della forma letterale del singolo carattere di quel personaggio. È definito dall'implementazione se un oggetto char può contenere valori negativi. I personaggi possono essere esplicitamente dichiarati senza firma o firmati. Plain char, signed char e unsigned char sono tre tipi distinti. Un char, un char firmato e un char unsigned occupano la stessa quantità di storage e hanno gli stessi requisiti di allineamento (basic.types); cioè, hanno la stessa rappresentazione dell'oggetto. Per i tipi di carattere, tutti i bit della rappresentazione dell'oggetto partecipano alla rappresentazione del valore. Per i tipi di caratteri senza segno, tutti i possibili schemi di bit della rappresentazione del valore rappresentano numeri. Questi requisiti non valgono per altri tipi. In ogni implementazione particolare, un oggetto char semplice può assumere gli stessi valori di un char firmato o di un char unsigned; quale è definito dall'implementazione.

char, unsigned char e signed char sono quindi tre tipi distinti e boost::is_integral dovrebbe essere specializable per questi tre tipi. Ci si può aspettare che gcc 4.4.7 o l'ambiente dell'OP lo ignorino e cercherò una spiegazione. Si prega di vedere questa risposta temporanea come un commento esteso sulla domanda di OP.


EDIT: Non è possibile riprodurre

Sistema: Red Hat 6

$ uname -a 
Linux ysc 2.6.32-504.8.1.el6.x86_64 #1 SMP Wed Jan 28 21:11:36 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux$ 

Compiler:

$ g++ --version 
g++ (GCC) 4.4.7 20120313 (Red Hat 4.4.7-16) 

Fonte:

$ cat main.cpp 

#include <iostream> 

template<typename T> 
struct trait 
{ 
    static const int value = 0; 
}; 

template<> 
struct trait<char> 
{ 
    static const int value = 1; 
}; 

template<> 
struct trait<signed char> 
{ 
    static const int value = 2; 
}; 

template<> 
struct trait<unsigned char> 
{ 
    static const int value = 3; 
}; 

int main() 
{ 
    std::cout << "int:, " << trait<int>::value << "!\n"; 
    std::cout << "char:, " << trait<char>::value << "!\n"; 
    std::cout << "unsigned char:, " << trait<unsigned char>::value << "!\n"; 
    std::cout << "signed char:, " << trait<signed char>::value << "!\n"; 
} 

Compilation:

$ g++ -Wall -Wextra main.cpp 

Run:

$ ./a.out 
int:, 0! 
char:, 1! 
unsigned char:, 3! 
signed char:, 2! 

cosa produce sull'ambiente OP?

+0

Questa non è una risposta. –

+0

Lo so; come ho detto, per favore leggilo come un grande commento. – YSC

+0

Ma non è un commento. È pubblicato come risposta .... –

Problemi correlati