c++ - 为什么这段代码无法编译?

标签 c++ floating-point valarray

我知道这是一个非常笼统的标题,但我有一些代码,它让我感到奇怪,因为它无法编译。

Here是问题的演示。如果您将 scalar_tdouble 更改为 float,代码可以正常编译。为什么float不能在这里提升为double?事实上,如果将常量更改为 doubles (1.0) 或 ints (1),它们也会不能推广。这难道不是应该正常工作的事情吗?

完整代码示例:

#include <valarray>
#include <numeric>
#include <iterator>
#include <iostream>

template<typename T>
T sigmoid(const T &in)
{
    return 1.f / (1.f + std::exp(-in));
}

template<typename T>
T logit(const T &in)
{
    return std::log(in / (1.f - in));
}

using scalar_t = double;

int main(int argc, char **argv)
{
    std::valarray<scalar_t> f = { 0.1f, 0.3f, 0.5f, 0.9f };

    scalar_t alpha = 0.5f;
    scalar_t beta = -1.f;

    auto lC = logit(f);    
    std::valarray<scalar_t> skC = alpha * lC + beta;
    auto sC = sigmoid(skC);

    std::copy(std::begin(sC), std::end(sC), std::ostream_iterator<scalar_t>(std::cout, " "));
    std::cout << std::endl;

    scalar_t num = 0.7f;
    auto lS = logit(num);
    auto sS = sigmoid(alpha * lS + beta);

    std::cout << sS << std::endl;

    return 0;
}

最佳答案

您使用的运算符-定义为

template <class T> std::valarray<T> operator- (const T& val, const std::valarray<T>& rhs);

这意味着它希望 valvalarray 中的元素类型相同。由于您在使用 float 时发生模板参数推导,它会看到 val 是一个 floatrhs 有一个double 的元素类型。由于这些类型不匹配,因此推导失败并且您会收到编译器错误。请记住,在模板参数推导期间不会发生任何转换。

关于c++ - 为什么这段代码无法编译?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40387115/

相关文章:

ios - 为什么 GLSL 的算术函数在 iPad 上与在模拟器上产生如此不同的结果?

c++ - cos(x) 是否需要在使用 IEEE-754 的不同 C++ 实现中返回相同的值?

c++ - 用 std::valarray 替换 POD C 样式数组是个坏主意吗?

c++ - 有什么办法可以避免 valarray 和数组之间的复制?

c++ - test_and_set 线程的这种用法安全吗?

c++ - 应用程序之间的共享代码

javascript - 如何在 JavaScript 上处理缺少 Integer 类型的金融应用程序中的数字?

c++ - 通过成员初始化列表初始化结构体

c++ - 使用重载构造函数赋值

c++ - MEX 中 Matlab 和 C++ 之间的内存共享