编译时的重大更改摘要

更新:2007 年 11 月

本主题概括介绍现在将对代码发出的编译时错误和警告,在 Visual C++ 2003 之前,该代码在编译时未出现错误或警告。但是,Visual C++ 2005 中引入了某些与一致性相关的编译时重大更改。

  • 定义的预处理器指令现在需要右括号 (C2004)。

  • 缺少 typename 关键字,并且显式专用化不再从主模板查找模板参数 (C2146)。

  • 受保护成员 (n) 只能通过类 (B)(该类从 (n) 是其成员的类 (A) 继承)的成员函数访问 (C2247)。

  • 编译器中改进的可访问性检查现在检测不可访问的基类 (C2247)。

  • 显式专用化不能是复制构造函数或复制赋值运算符 (C2299)。

  • 如果析构函数和/或复制构造函数不可访问,则无法捕获异常 (C2316)。

  • 不再允许指向函数的指针上的默认参数 (C2383)。

  • 静态数据成员无法通过派生类初始化 (C2477)。

  • 标准不允许对 typedef 初始化,并且初始化现在将生成编译器错误 (C2513)。

  • bool 现在是正确的类型 (C2632)。

  • 对于重载运算符,UDC 现在可能会产生多义性 (C2666)。

  • 限定转换不同于标识转换 (C2666)。

  • 更多的表达式现在被视为有效的 null 指针常量 (C2668)。

  • template<> 在以前编译器要推断的位置现在是必需的 (C2768)。

  • 如果已通过模板类专用化对类外部成员函数进行了显式专用化,则该函数的显式专用化无效。 (C2910)。

  • 对于每个显式专用化,必须选择每个显式专用化的参数,以使其与主模板的参数匹配 (C2912)。

  • 不再允许浮点非类型模板参数 (C2993)。

  • 类模板不允许作为模板类型参数 (C3206)。

  • 不再将友元函数名称引入包含命名空间 (C3767)。

  • 增强了指向成员的指针一致性 (C3867)。

  • 编译器将不再在宏中接受多余逗号 (C4002)。

  • 使用 () 形式的初始值设定项构造的 POD 类型的对象将被默认初始化 (C4345)。

  • 如果依赖名称将被视为一个类型,则 typename 现在是必需的 (C4346)。

  • 以前被不正确视作模板专用化的函数不再被视作模板专用化 (C4347)。

  • 静态数据成员无法通过派生类初始化 (C4356)。

  • 在返回类型中使用类模板专用化之前需要对其进行定义 (C4686)。

  • 编译器现在将报告无法访问的代码 (C4702)。

  • 必须定义声明新的非模板函数的友元声明 (LNK2019)。

请参见

参考

Visual C++ 编译器中的重大更改