Ich weiß, dass es ein ziemlich allgemeiner Titel ist, aber ich habe etwas Code und es erscheint mir so komisch, dass es nicht kompilieren kann.Warum kann dieser Code nicht kompiliert werden?
Here ist eine Demo des Problems. Wenn Sie scalar_t
von double
zu float
ändern, kompiliert der Code fein. Warum kann float hier verdoppelt werden? wenn Sie die Konstanten double
s (1.0
) oder int
s (1
) ändern auch sie kippen werden in der Tat gefördert. Ist das nicht die Art von Sache, die nur funktionieren sollte?
Vollcodebeispiel:
#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;
}
Förderung ist nicht das Problem. 'valarray's' operator-'leitet den gleichen Typ für die linke Seite (' T const & ') und die rechte Seite (' valarray const & ') ab. Es ist widersprüchlich, weil es für dasselbe Template-Argument sowohl "float" als auch "double" erhält. Sie sollten es beheben können, indem Sie '1.0'. –
0x499602D2
"Warum kann float hier nicht befördert werden?" Auf welchen bestimmten Punkt in Ihrem Code beziehen Sie sich als "hier"? Von welcher Promotion sprichst du? – AnT
@ 0x499602D2 Sie haben recht, aber warum sollte hier keine implizite Konvertierung stattfinden? Ich kann es nicht wirklich beheben, indem ich 1 mache.0 weil ich kein Vorwissen von 'scalar_t 'habe (oder davon ausgehe, dass ich das nicht tue) –