GCC不喜欢带空格的C ++样式转换

时间:2010-06-03 04:53:42

标签: c++ gcc casting g++ compiler-errors

我正在将一些C ++代码移植到GCC,并且当涉及到sapces时,显然它对C ++样式转换不满意,如unsigned int(-1)long long(ShortVar)等...它给出了{{ 1}}。

有没有什么方法可以与海湾合作委员会达成和平而不会超过其中每一个并以c风格重写?

3 个答案:

答案 0 :(得分:5)

你想要static_cast<unsigned int>(-1)和亲属。那些往往被视为更多C ++风格的演员阵容,并且没有相同的问题。

为了它的价值,你必须这样做:

template <typename T>
struct identity
{
    typedef T type;
};

然后:

identity<unsigned int>::type(-1);

<子> 或者在C ++ 0x中:

template <typename T>
using id = T;

id<unsigned int>(-1);

答案 1 :(得分:3)

GCC正确地哭了 - unsigned int(-1)是一种符合C ++ 03标准(5.4.2)的符号:

  

显式类型转换可以使用函数表示法(5.2.3),类型转换运算符(dynamic_cast,static_cast,reinterpret_cast,const_cast)或强制转换表示法表示:

cast-expression:
   unary-expression
   ( type-id ) cast-expression

因此,你可以用括号修正演员表,按照GMan提出的优秀建议:) - 我真的推荐后者。

编辑:功能表示法需要简单类型说明符:

  

5.2.3 - 简单类型说明符(7.1.5)后跟带括号的表达式列表,在给定表达式列表的情况下构造指定类型的值。

简单类型说明符不包括复合类型(带空格的那些)。

答案 2 :(得分:0)

您键入static_cast<unsigned int>(-1)的概率很高,但确实需要std::numeric_limits<unsigned int>::max(),或者如果不适用,则UINT_MAX

差异主要在于后两者表达了你想要的东西。如果有的话,将-1转换为unsigned int的表达性较差,因此不是首选解决方案。

一般来说,喜欢写表达代码。你以后会感谢自己,你的程序员和人力资源部门也不会对你不满。