2017-04-07 72 views
7

我想要一個static constexpr數組類元素的模板類內類似於以下代碼的靜態constexpr模板陣列構件這個例子,但它已經顯示了這個問題。如果我編譯這個機智gcc我得到一個遞歸依賴性的錯誤:自身遞歸需要

test.cc: In instantiation of ‘constexpr Element Template<true>::element [2]’: 
test.cc:11:27: recursively required from ‘constexpr Element Template<true>::element [2]’ 
test.cc:11:27: required from ‘constexpr Element Template<true>::element [2]’ 
test.cc:20:2: required from here 
test.cc:11:27: fatal error: template instantiation depth exceeds maximum of 900 (use -ftemplate-depth= to increase the maximum) 
    static constexpr Element element[] = { 
        ^
compilation terminated. 

首先我很好奇如何繞過這個錯誤,但也將是林間空地,如果我能得到一個提示到的這個或事業爲什麼這樣的構造不應該是有效的......

+0

你有什麼版本的GCC?我無法用任何編譯器重現。 – DeiDei

+0

我測試過'g ++ - 5.4.0'。我只注意到,如果我只使用上面的摘錄,編譯器不會失敗。之後我必須使用'Template :: element' .. – Jonas

+0

看起來像編譯器的錯誤。作爲解決方法,[它工作](https://godbolt.org/g/yDMmWt)與'std :: array'。 –

回答

-2

您需要指定元素數組的大小。 Element element[]是無效的C++。

template <bool Reverse> 
struct Template { 
    static constexpr Element element[2] = { 
     Element (Reverse ? 1 : 0), 
     Element (Reverse ? 0 : 1), 
    }; 
}; 
+0

請原諒? [不服氣](https://godbolt.org/g/1z87oi)。 – DeiDei

+0

明確指定大小不會導致錯誤消失:( – Jonas

+0

看起來像使用'gcc-6.1' [link](https://godbolt.org/g/SnxSSb),但不適用於以前的版本。 – Jonas