【问题标题】:C4267 conversion warning in constructor - can't fix with overload?构造函数中的 C4267 转换警告 - 无法通过重载修复?
【发布时间】:2019-10-31 14:08:12
【问题描述】:

以下代码产生编译器警告 C4267:

MyClass::MyClass(int size) {...};
MyClass(someVector.size()); //C4267 - Conversion of size_t to int

由于 std::vector::size() 返回 size_t。解决此问题的一种方法是在调用构造函数时使用强制转换,但这需要在每次使用 MyClass 时使用强制转换。 相反,我想创建一个接受 size_t 的 MyClass 构造函数的重载,执行强制转换,然后正常进行:

MyClass::MyClass(int size) {...};
MyClass::MyClass(size_t size) {...};

不幸的是,尽管这样做,我仍然收到 C4267 编译器警告。更糟糕的是,在其他地方发生的其他 MyClass 调用(传递一个 int)现在会生成编译器错误 C2668,“'function':对重载函数的模糊调用”。

我真的很希望能够在不修改警告级别的情况下解决这个问题。

【问题讨论】:

  • 为什么不去掉 int 构造函数?
  • 您使用的是哪个版本的 MSVC?它适用于 VS 2017。
  • 或者您是否将size_t 定义为MyClass 中的类型?
  • @Jonathan 好主意,解决了。
  • std::vector<>::size() 返回std::vector<>::size_type。虽然很可能是std::size_t,但使用std::vector<>::size_type 可能是一个更好的主意。

标签: c++


【解决方案1】:

这是通过完全摆脱 int 构造函数而只使用 size_t 构造函数来解决的。

普通的 int 使用 32 位,而 size_t 使用 64 位。从 size_t 转换为 int 可能会丢失数据,但反过来转换则不会造成这种危险。因此,构造函数的现有 int 使用在转换为 size_t 时不会产生转换警告。

非常感谢@Jonathan Potter。

【讨论】:

  • 嗯...std::size_tunsigned 类型,而 intsigned 类型。这意味着从intstd::size_t 的转换可能很容易导致价值损失。损失可能是可逆的,但仍然:在您最初打算使用int 的地方使用std::size_t 是一个非常奇怪的想法(除非您首先认为int 不合适)。
  • 好点。在这种情况下,int 总是被用作事物的计数,并且使用原始的 int 构造函数,有许多从 size_t 到 int 或 unsigned int 的静态转换,以试图绕过编译器警告,所以不用担心丢失由于标牌的数据,因为在这种情况下该值永远不会是负数。你是绝对正确的,但是 size_t 并不是在所有情况下都可以作为 int 的万无一失的替代品。
猜你喜欢
  • 2018-01-26
  • 2019-09-02
  • 2011-01-27
  • 2018-07-19
  • 1970-01-01
  • 2021-10-02
  • 2022-07-05
  • 1970-01-01
  • 2012-07-22
相关资源
最近更新 更多