2016-10-16 3 views
2

私は次のような問題があります。クラスのインスタンス

template< typename T, size_t N, size_t... N_i > 
struct A 
{ 
    // nested class 
    template< typename... Ts > 
    class B 
    { 
     //... 

     A<T, N_i...>::B<Ts...> operator[](size_t i) 
     { 
     A< T, N_i...>::B<Ts...> res{ /* ... */ }; 

     return res; 
     } 

     // ... 
    }; 
}; 

は残念ながら、コンパイラは「A < T, N_i...>::B <Ts...> res{ /* ... */ };」のエラーを生成します。誰も私がclass Bのインスタンス化を返す方法を知っていますか(彼の外側のテンプレート引数ではです)、 "operator[]"はclass Bですか?

事前に感謝します。

答えて

2

A<T, N_i...>B<Ts...>templatetypenameを追加する十分なはずです。

私は

template< typename T, size_t N, size_t... N_i > 
struct A 
{ 
    // nested class 
    template< typename... Ts > 
    class B 
    { 
     //... 

     typename A<T, N_i...>::template B<Ts...> operator[](size_t i) 
     { 
     typename A< T, N_i...>::template B<Ts...> res{ /* ... */ }; 

     return res; 
     } 

     // ... 
    }; 
} 

P.sを意味する:C++ 11にも動作するはずです。 C++だけでなく14

2

戻り値の型の完全な型の前にtypenameを置くことは、あなたが得ているエラーを修正するものです。ただし、Bの後にB型が常にその型の「現在の」インスタンス化を参照した後に、テンプレートパラメータを配置しないでください。

#include <stdio.h> 
using namespace std; 

template< typename T, size_t N, size_t... N_i > 
struct A 
{ 
    // nested class 
    template< typename... Ts > 
    class B 
    { 
     //... 

     typename A<T, N_i...>::B operator[](size_t i) 
     { 
     typename A< T, N_i...>::B res{ /* ... */ }; 

     return res; 
     } 

     // ... 
    }; 
}; 

https://godbolt.org/g/hsB4pW

+0

申し訳ありませんが、わかりません。あなたの答えの '演算子[]'は何を返しますか? 'A :: B 'または 'A :: B '?私が正しく理解していれば、OPは 'A :: B ' – max66

+0

をもう一度お聞きします。「完全型の前に 'namespace'を置く」とはどういう意味ですか? – max66

+0

@ max66もう一度ありがとう。 – xaxxon

関連する問題