私はそれがかなり一般的なタイトルだと知っていますが、私はいくつかのコードを持っていて、それは私がコンパイルできない奇妙なものです。このコードはなぜコンパイルに失敗しますか?
Hereは、この問題のデモです。 scalar_t
をdouble
からfloat
に変更するとコードが正常にコンパイルされます。なぜここで倍増することができないのですか?実際に、定数をdouble
(1.0
)またはint
(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;
}
プロモーションに問題はありません。 'valarray'の' operator-'は、左辺(' T const& ')と右辺(' valarray const& ')の両方について同じ型を推論します。同じテンプレート引数に対して 'float'と' double'の両方を取得するので、競合します。 '1.0'を実行することで修正できるはずです。 –
0x499602D2
「なぜここで二重にすることができないのですか?あなたのコードのどの特定のポイントを "ここ"と呼んでいますか?あなたは何の宣伝をしていますか? – AnT
@ 0x499602D2あなたは正しいですが、ここで暗黙的な変換が行われるべきではないのはなぜですか?私は本当に1を行うことによってそれを修正することはできません。私が 'scalar_t'の知識を持っていない(またはこの議論ではないと仮定して) –