系统头文件中的重定义错误,因为" signed char"和" char"

时间:2015-12-07 11:28:04

标签: c++ linux

我尝试包含此文件

 boost/assign/list_of.hpp

但我有这个编译器的错误

/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>

文件is_integral.hpp中的这些定义行(32,38)是:

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

如何解决编译问题?编译器是gcc版本4.4.7 20120313操作系统是Red Hat Enterprise Linux Server 6.5版(圣地亚哥)

1 个答案:

答案 0 :(得分:2)

来自C ++标准

  

3.9.1基本类型[basic.fundamental]

     

声明为字符(char)的对象应足够大,以存储实现的基本字符集的任何成员。如果此组中的字符存储在字符对象中,则该字符对象的整数值等于该字符的单个字符文字形式的值。实现定义char对象是否可以保存负值。字符可以显式声明为unsigned或signed。 Plain char,signed char和unsigned char是三种不同的类型。 char,signed char和unsigned char占用相同数量的存储空间并具有相同的对齐要求(basic.types);也就是说,它们具有相同的对象表示。对于字符类型,对象表示的所有位都参与值表示。对于无符号字符类型,值表示的所有可能位模式表示数字。这些要求不适用于其他类型。在任何特定实现中,普通char对象可以采用与signed char或unsigned char相同的值;哪一个是实现定义的。

charunsigned charsigned char因此是三种不同类型,boost::is_integral应该适用于这三种类型。人们可以期待gcc 4.4.7或OP的环境忽略它,我会寻找解释。请将此临时答案视为对OP问题的扩展评论。

编辑:无法重现

系统: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$

编译器

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

来源

$ 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"; 
}

汇编

$ g++ -Wall -Wextra main.cpp 

运行

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

它在OP的环境中产生了什么?