[問題] 如何消除泛型降轉的警告

作者: 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