作者LPH66 (かつて交わした约束)
看板C_and_CPP
标题Re: [问题] cannot appear in a constant-expression
时间Sun Mar 12 19:33:50 2017
先讲 error
这里你的 RTYPE1 是个到了执行期才会知道是谁的数值
但 template<int N> 这种模版必须要是编译期就知道是多少的值
编译器才能根据这 N 值的多少来决定实现怎麽样的模版
错误讯息就是在告诉你那里必须要是一个 compile-time constant, 「编译期常数」
RTYPE2 在编译器就能知道它是 14, 所以就能套进来用
但这里并不是直接在哪里改个什麽东西就能用
问题在於 sexp_type() 这样的实作似乎暗示着他有些执行期才能确定的东西
因此你不能使用 sexp_type() 的回传值来用
那回到你的问题, 你想要的是一个容器里的内装型态
这种资讯没有比直接去问该容器本身更好的办法了
我如果没找错资料的话, 这个 NumericVector (aka. Vector<REALSXP>) 容器里
有这样子的定义:
http://tinyurl.com/hpg55pz
typedef typename traits::r_vector_proxy<RTYPE>::type value_type ;
所以你要的型态就是 NumericVector::value_type
现在这一类型的容器里都会有这种型态定义
除了方便存取也有助於整合进 C++STL 的一些模版函数
====
那这里还有一个要提的是 C++11 的 constexpr
这个关键字就是在指名说「虽然我函式写成这样, 但它的值是多少编译期可以算得出来」
呼叫这种东西所得到的值就可以用在上述这种需要编译期常数的地方
当然能放这个关键字的函式就真的要是编译期能算得出来的东西
太复杂的话是不行的
但这个需要加在产生值的函式上, 以这一例子可能可以加在 sexp_type()
但它之所以不加的原因就又回到刚才提的可能具有一些执行期才知道的东西
这并不是你所可以控制的
--
'You've sort of made up for it tonight,' said Harry. 'Getting the
sword. Finishing the Horcrux. Saving my life.'
'That makes me sound a lot cooler then I was,' Ron mumbled.
'Stuff like that always sounds cooler then it really was,' said
Harry. 'I've been trying to tell you that for years.'
-- Harry Potter and the Deathly Hollows, P.308
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 180.177.29.238
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/C_and_CPP/M.1489318432.A.7D0.html
※ 编辑: LPH66 (180.177.29.238), 03/12/2017 19:34:52
1F:推 celestialgod: 谢谢大大,我还没分清楚compile-time跟 03/12 19:59
2F:→ celestialgod: 非compile-time的constant差异 03/12 19:59
3F:→ celestialgod: 大大这样解释,我就清楚了 03/12 19:59
4F:推 loveflames: const有保证complile time求出吗,我的话会再加上cons 03/12 19:59
5F:→ loveflames: texpr 03/12 19:59
6F:→ celestialgod: 我後来测试用stored_type才对 03/12 20:02
7F:→ celestialgod: 不过还是感谢大大指出我的盲点 03/12 20:02
8F:→ LPH66: const 没有, 不过我猜写 14 那个是编译器看到了所以帮做 03/12 21:09
9F:推 loveflames: 後来有爬到文,说const的值若能在compile time 03/12 21:18
10F:→ loveflames: 算出,则等同修饰constexpr 03/12 21:19