作者xavier13540 (柊 四千)
看板C_and_CPP
标题[问题] template class 里 member function 的递回呼叫
时间Fri Dec 30 21:16:32 2016
开发平台(Platform): Win10
编译器: g++ -std=c++14
问题(Question):
小弟目前在写一个多项式的class
template<class R> class polynomial{...};
定义了operator *
小弟希望能做到
当R = complex<double>时
乘法可以用FFT加速
而当R = int/double时
1. 把乘号两边的多项式embed到polynomial<complex<double>>
2. 用polynomial<complex<double>>的乘法回传结果 手动转回polynomial<R>
code如下 看起来很长但是
乘法在第84-129行 可能有问题的部分在第107-125行
其他部分(e.g. FFT)可以不用管@@
http://ideone.com/JbRjhU
compiler说 在做两个polynomial<int>的相乘时
没办法从polynomial<complex<double>>转型到polynomial<int>
可是小弟在第114行 明明是用polynomial<complex<double>>去接f*g啊
请问是哪里写烂了rdrrC
--
1F:→ iWRZ:传说原本小红帽是R-18故事......01/07 13:53
2F:→ iWRZ:天方夜谭也是很多R-1801/07 13:54
3F:推 ID556:格林童话原也是 R-1801/07 13:58
4F:推 flysonics:Fate/SN也是R-1801/07 14:00
5F:推 belmontc:H-game也都是R-1801/07 14:00
6F:→ minoru04:油厂国小也是R-1801/07 14:09
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 140.112.248.40
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/C_and_CPP/M.1483103797.A.4E8.html
7F:推 LPH66: 呃, ideone 指的 result 是 105 行的喔 12/30 21:52
我原本认为程序是这样的
跑到136 呼叫84
// 因为R=int 执行107-125
跑到114 呼叫84
// 因为R=complex<double> 执行86-105
算好105的result 传回给上一层的114
算好125的result 传回给上一层的136
所以我不懂为什麽compiler传回错误是在第105行啊=口=
8F:→ LPH66: 稍微看了一下, 你这里或许需要用 enable_if 间接达成 12/30 21:55
9F:→ LPH66: 依然模版参数型态选择实作这个目的 12/30 21:55
10F:→ LPH66: *依照 12/30 21:55
11F:→ LPH66: 不然因为你两个状况都写了, 即使其中一边不进去还是会报错 12/30 21:56
※ 编辑: xavier13540 (140.112.248.40), 12/30/2016 22:10:24
14F:→ holydc: 直接 overload,template 版本不要跟 class 共用 R 的话呢 12/30 22:33
这样如果没有下面的slow_multiplication()那几行
我就允许(*this)不是复系数多项式 但可以跟另一个复系数多项式相乘欸@@
※ 编辑: xavier13540 (140.112.248.40), 12/30/2016 22:47:56
15F:推 LPH66: // 因为R=int 执行107-125 ←问题在这里 12/30 23:40
16F:→ LPH66: 确实是只执行 107-125 没错, 但那个版本里 86-105 也还在 12/30 23:41
17F:→ LPH66: 而 86-105 那一段当代 R=int 进去时是编不过的 12/30 23:41
18F:→ LPH66: 所以我才会建议用 enable_if 拆开 12/30 23:42
21F:→ LPH66: <class S> 这一层是必要的, 要让成员有模版才能 SFINAE 掉 12/31 00:07
22F:→ LPH66: 启用点在 operator * 里的呼叫, 使三个成员模版都试过一次 12/31 00:09
23F:→ LPH66: 然後只有其中一个的 enable_if<> 会成立而产生程式 12/31 00:09
24F:→ LPH66: 另外两个被 SFINAE 掉了所以完全不存在於那个版本的类别中 12/31 00:10
25F:→ LPH66: 因此就不会编不过 12/31 00:10
好的 我找个时间来研究看enable_if
以前不知道有这种东西@@
26F:推 johnjohnlin: 不是应该要用特例化吗 12/31 16:54
实际上我只有operator *需要specialization
我这份code已经砍掉了其他不相干的东西(e.g. +, -, etc.)了 原本的class更大
如果要为了|C[x]/|R[x]/Z[x] 重写一堆完全一样的member function们 感觉不太健康
※ 编辑: xavier13540 (140.112.248.40), 12/31/2016 19:14:55
※ 编辑: xavier13540 (140.112.248.40), 12/31/2016 19:15:57