こんにちは。
できれば再現するソースを上げて頂ければよいのですが、上がっているものを使ってやるだけやってみました。
が、結局エラーは取れませんでした。msvc 2015では通るのですが、MinGW(gcc) 5.4.0では通りません。
(取り敢えず、-std=c++14をつけてます。gccのバージョンやオプョンも情報公開された方が話は早いと思いますよ。)
まず、そのままですとstd::size_t未定義ですので、#include <cstddef>
を補いました。
次に、const指定漏れが多数ありましたので、補いました。
最初に"ab"という、char const[3]型を与えているため、以降、全てconstが必要になります。
途中非const変数へconst変数を代入しようとしてエラーになります。
そして、class string<1>のtext_をプライマリのstring<>からアクセスしようとしてprivateエラーとなりましたので、publicへ移動しました。
C++
1#include <cstddef>
2namespace wck {
3 template<std::size_t N>
4 class string {
5 private:
6 public:
7 const char text_;
8 const string<N - 1> next_;
9 constexpr string(char const* str) : next_(str + 1) , text_(str[0]){
10
11 }
12 template<std::size_t V>
13 constexpr char const at(std::size_t pos, string<V> str) const {
14 return pos == 0 ? str.text_ : at(pos - 1, str.next_);
15 }
16 constexpr char const operator[](std::size_t pos) const {//ここです
17 return at(pos,*this);
18 }
19 };
20 template<>
21 class string<1> {
22 private:
23 public:
24 const char text_;
25 constexpr string(char const* str) : text_(str[0]) {
26
27 }
28 };
29}
30int main() {
31 constexpr wck::string<3> str1("ab");
32
33 constexpr char const a = str1[1];
34}
最後に残ったエラーは、下記です。
test.cpp: In instantiation of 'constexpr const char wck::string<N>::at(std::size_t, wck::string<V>) const [with unsigned int V = 1u; unsigned int N = 3u; std::size_t = unsigned int]':
test.cpp:14:45: recursively required from 'constexpr const char wck::string<N>::at(std::size_t, wck::string<V>) const [with unsigned int V = 2u; unsigned int N = 3u; std::size_t = unsigned int]'
test.cpp:14:45: required from 'constexpr const char wck::string<N>::at(std::size_t, wck::string<V>) const [with unsigned int V = 3u; unsigned int N = 3u; std::size_t = unsigned int]'
test.cpp:17:22: required from 'constexpr const char wck::string<N>::operator[](std::size_t) const [with unsigned int N = 3u; std::size_t = unsigned int]'
test.cpp:33:36: required from here
test.cpp:14:45: error: 'class wck::string<1u>' has no member named 'next_'
return pos == 0 ? str.text_ : at(pos - 1, str.next_);
^
constexpr char const a = str1[1];でoperator[]が呼ばれ、それがat(1, str1)を呼ぶことになります。
そのat()は、at(0, string<2>::next_)を呼びます。そのat()はat(-1, string<1>::next_)を呼びませんが、評価はされますので、string<1>::next_はないから、未定義エラーになります。
msvcは呼ばれない場合は評価しないのかも知れません。(バグの検出が遅れるため、嫌な仕様です。)
この問題は_pumpkinさんのところでは発生していないようですので、対策は省略します。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/12/21 11:34