[问题] 如何消除泛型降转的警告

楼主: s4300026 (s4300026)   2019-08-27 15:59:01
开发平台(Platform): (Ex: Win10, Linux, ...)
win7
编译器(Ex: GCC, clang, VC++...)+目标环境(跟开发平台不同的话需列出)
vc2010
额外使用到的函数库(Library Used): (Ex: OpenGL, ...)
问题(Question):
如题
喂入的资料(Input):
T = Point, K = float
T = PointF, K = double
预期的正确结果(Expected Output):
错误结果(Wrong Output):
warning C4244
将 float 转 int 可能导致资料遗失
将 double 转 float 可能导致资料遗失
程式码(Code):(请善用置底文网页, 记得排版,禁止使用图档)
template <typename T, typename K>
void func(T a, K b, T &c)
{
c.X = a.X * b;
}
补充说明(Supplement):
原本以为 decltype 可以帮上忙, 但似乎不能这样写...
c.X = (decltype c.X) (a.X * b);
正确写法
c.X = (decltype (c.X)) (a.X * b);
看到 warning 很烦躁...
我知道T, K不能乱丢型态进去
因此我想要把泛型做成 class private
然后 public 指定的T K
感谢大大拨冗观看
作者: sarafciel (Cattuz)   2019-08-27 16:41:00
你的T跟K为什么一定要带会降转的case进去呢?
楼主: s4300026 (s4300026)   2019-08-27 17:55:00
因为 T 一定是Point或 PointF。 K至少要是float。 话说我还打算传自创的 PointD呢!T是点位,K是我的放大倍率
作者: LPH66 (-6.2598534e+18f)   2019-08-27 19:48:00
这跟泛型无关, 是降转的问题以 T.X 是 int, K 是 float 来说的话a.X * b 是一个 int 乘 float, 照规则会得到 float然后你要把一个 float 塞进 c.X 这个 int 里就喷 C4244 了这里跟泛型沾到边的地方只有因为泛型你不知道 T.X 的型态那么用 decltype 是对的, 但你忘了括号decltype 要带一对 () 里面放式子才是对的语法:https://en.cppreference.com/w/cpp/language/decltype
楼主: s4300026 (s4300026)   2019-08-28 08:07:00
你说的没错,这确实是降转的问题,但关键就在于泛型使我无法用已知型别强制转型,以及我不了解 decltype 该怎么使用。

Links booklink

Contact Us: admin [ a t ] ucptt.com