gpt4 book ai didi

c++ - 警告 C4244 : 'argument' : conversion from 'double' to 'const int' , 可能丢失数据

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:15:31 25 4
gpt4 key购买 nike

我正在定义“*”运算符以使用“NumericArray”类模板。代码如下:

template <class T>
NumericArray<T> NumericArray<T>::operator * (const T& factor) const
{
NumericArray<T> newArray(Size());
for (int i = 0; i < Size(); i++)
newArray[i] = factor * GetE(i);
return newArray;
}

当我尝试将类型为“int”的“NumericArray”(NumericArray)与“*”运算符一起使用时,当“factor”参数为 double 时:

intArray1 = intArray1*2.5;

我收到以下编译器警告:

warning C4244: 'argument' : conversion from 'double' to 'const int', possible loss of data

'factor' arg 在与'NumericArray' 对象的元素相乘之前从 2.5 截断为 2(一个整数)。有没有办法防止这种情况发生?我认为在 C++ 中这是一个简单的默认协议(protocol)问题,其中 int*double = double。我错了吗?如果不是,为什么这不适用于这种情况?

最佳答案

intArray1 = intArray1*2.5;

我猜 intArray1类型为 NumericArray<int> .如果是这样,那么 Tint .所以在上面的表达式中,2.5这是 double将被转换成 int ,因为它被传递给重载的 operator*(const int&)作为参数。

这也意味着,2.5( double )变为 2(整数)和 factor基本上是 2 .数据丢失!

解决这个问题的一种方法是使用函数模板(作为类模板的成员):

template<class T>   //this is for class templatwe
template<class U> //this is for function template
NumericArray<T> NumericArray<T>::operator * (const U& factor) const
{ //^^^^^^^ it is U now!
//your code
}

不要对 template 的两种用法感到惊讶在上面的定义中。评论说明了它们的用途。如果您理解得很好,那么您也理解参数nowU。而不是 T , 它可以独立于 T因此它可以是你传递给它的任何参数。就传递参数而言,没有数据丢失。

现在您知道 int 的产品了和 double结果是double ,那为什么要返回 NumericArray<int>来自函数,以防您传递 double到吗?我认为返回 NumericArray<double> 更有意义如果参数是 double .所以下面的似乎是正确的实现:

template<class T>   //this is for class templatwe
template<class U> //this is for function template
NumericArray<U> NumericArray<T>::operator * (const U& factor) const
{ //^^^ CHANGED
NumericArray<U> newArray(Size()); //CHANGED HERE TOO!
for (int i = 0; i < Size(); i++)
newArray[i] = factor * GetE(i);
return newArray;
}

等等!现在这是正确的吗?如果T怎么办是doubleUint ?上面的问题和上一个一模一样!

所以这是第三次尝试:

template<class T>   //this is for class templatwe
template<class U> //this is for function template
NumericArray<decltype(std::declval<T>() * std::declval<U>())>
NumericArray<T>::operator * (const U& factor) const
{
typedef decltype(std::declval<T>() * std::declval<U>()) R; //define R
NumericArray<R> newArray(Size()); //CHANGED HERE!
for (int i = 0; i < Size(); i++)
newArray[i] = factor * GetE(i);
return newArray;
}

所以返回类型是:

NumericArray<R>

哪里R是:

decltype(std::declval<T>() * std::declval<U>());

这取决于T的产品类型和 U .现在是正确的,至少好多了。

希望对您有所帮助。

关于c++ - 警告 C4244 : 'argument' : conversion from 'double' to 'const int' , 可能丢失数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18552880/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com