我尝试包含此文件
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版(圣地亚哥)
答案 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相同的值;哪一个是实现定义的。
char
,unsigned char
和signed 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的环境中产生了什么?