作者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/m.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