Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/158.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;模板运算符在从向量中减去标量时给出错误的结果_C++_Templates_Lambda_Integer Promotion - Fatal编程技术网

C++ C++;模板运算符在从向量中减去标量时给出错误的结果

C++ C++;模板运算符在从向量中减去标量时给出错误的结果,c++,templates,lambda,integer-promotion,C++,Templates,Lambda,Integer Promotion,我正在尝试制作一个模板操作符函数,用于从向量中减去标量,并在向量中返回结果。下面的功能是我能够想到的: // vector - scalar template<typename T1, typename T2> auto operator - ( const Vector<T1> & lhs, const T2 & scalar )-> Vector<std::common_type_t<T1,T2>> { using

我正在尝试制作一个模板操作符函数,用于从向量中减去标量,并在向量中返回结果。下面的功能是我能够想到的:

// vector - scalar
template<typename T1, typename T2>
auto operator - ( const Vector<T1> & lhs, const T2 & scalar )-> Vector<std::common_type_t<T1,T2>>
{
   using T3 = std::common_type_t<T1, T2>;
   Vector<T3> result;
   result.base.reserve( lhs.base.size() );
   std::transform( lhs.base.begin(), lhs.base.end(), std::back_inserter( result.base ),
             [&scalar]( const T3 & element ) { return element - scalar; } );
   return result;
}
//向量-标量
模板
自动运算符-(常量向量和lhs,常量T2和标量)->向量
{
使用T3=std::普通类型;
矢量结果;
result.base.reserve(lhs.base.size());
std::transform(lhs.base.begin()、lhs.base.end()、std::back\u插入器(result.base),
[&scalar](常量T3&element){return element-scalar;});
返回结果;
}
但是,尝试从向量(int)减去标量(float)时,结果不正确。我怀疑问题是因为操作数经过了通常的算术转换,包括整数提升


这与模板无关,但与浮点数不精确这一事实有关

这会产生与您在评论中特别引用的相同的“错误结果”:

float subtract(float a, float b)
{
    return a-b;
}

int main()
{
    std::cout << subtract(2, 2.1) << std::endl;

    return 0;
}
浮点减法(浮点a、浮点b)
{
返回a-b;
}
int main()
{

std::cout“不正确”和“错误的结果”不是一个有用的问题描述。一个简单的测试产生预期的结果,使用
std::vector
float
标量结果在
std::vector
结果中使用正确的值。无法复制。定义“错误的结果”。@Sam Varshavchik,不确定你的意思“无法重现”-演示的目的是重现问题。无论如何,示例显示:v-s=(1,2,3)-2.1=(-1.1,-0.099999,0.9),这是错误的。正确的结果是向量:[-1.1f,-0.1f,0.9f]。让我困惑的是,第二个元素的结果是-0.0999999,其他元素是正确的。不,这些结果是正确的。你缺少的是一个事实。你是正确的,它与模板无关,只是C/C++浮点运算不精确。我试着使用Bruce Dawson的“AlmosteQual2SComplete”方法()在我的相等运算符中。仍然需要一些调整。