我知道这是一个非常笼统的标题,但我有一些代码,它让我感到奇怪,因为它无法编译。
Here是问题的演示。如果您将 scalar_t
从 double
更改为 float
,代码可以正常编译。为什么float不能在这里提升为double?事实上,如果将常量更改为 double
s (1.0
) 或 int
s (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);
这意味着它希望 val
与 valarray
中的元素类型相同。由于您在使用 float
时发生模板参数推导,它会看到 val
是一个 float
但 rhs
有一个double
的元素类型。由于这些类型不匹配,因此推导失败并且您会收到编译器错误。请记住,在模板参数推导期间不会发生任何转换。
关于c++ - 为什么这段代码无法编译?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40387115/