由于"signed char"和"char",系统头文件中的重定义错误
redefinition error in system header file because of "signed char" and "char"
我试图包含这个文件
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版(Santiago)
来自C++标准
3.9.1基本类型【basic.basic】
声明为字符(char)的对象应足够大,以存储实现的基本字符集的任何成员。如果该集合中的字符存储在字符对象中,则该字符对象的整数值等于该字符的单字符文字形式的值。实现定义了char对象是否可以包含负值。字符可以显式声明为无符号或有符号纯字符、有符号字符和无符号字符是三种不同的类型。一个字符、一个有符号字符和一个无符号字符占用相同的存储量,并且具有相同的对齐要求(basic.types);也就是说,它们具有相同的对象表示。对于字符类型,对象表示的所有位都参与到值表示中。对于无符号字符类型,值表示的所有可能的位模式都表示数字。这些要求不适用于其他类型。在任何特定的实现中,纯字符对象可以采用与有符号字符或无符号字符相同的值;哪一个是实现定义的。
因此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的环境产生了什么影响?
相关文章:
- 在没有定义返回类型的函数中返回布尔值,并将结果保存在无错误的char编译中-为什么
- 在标准中,模板参数的语法在哪里定义,例如,'std::function<int(char)>'?
- 为什么从 char 转换为 std::byte 可能是未定义的行为?
- 从 std::string 到 std::array<char,size> 的 memcopy 额外数据是否是一种未定义的行为?
- 将结构 std::memcpy 转换为具有足够容量的 std::vector 是未定义的行为<char>吗?
- 包括"lvtocon.h",未定义对'operator<<(std::ostream&, char const*)的引用
- 未定义模板"std::__1::basic_istringstream<char, std::__1::char_traits<char>, std::__1::allocator&
- C++ 如何检查 char 变量是否未定义(未初始化)
- 将字符串文本常量定义为 char const* 和 wchar const*
- 定义.cpp中常数int/char*
- 仅使用 bool 和 char 定义一个 templete 类
- 是否很好地定义了强制转换为仅由 char[] 组成的结构并从该数组读取?
- 来自 cpp首选项的用户定义的 const char* 文字示例
- gtest - 未定义对"testing::InitGoogleTest(int*, char**)"的引用
- Qt5 对'QApplication::QApplication(int&, char**, int)'的未定义引用
- 自定义char*插入功能多次运行时会产生运行时错误
- 如何在 C++ 中安全地为 char *array 重新分配内存(它适用于自定义字符串类)
- [lex.ccon] 中 c-char 的定义可能存在矛盾
- 定义char数据类型,并与sprintf一起使用
- 为什么 C 或 C++ 标准没有明确将 char 定义为有符号或无符号?