2
次のコードでは、テンプレートパラメータT
の値がB<m>
の場合、クラスA
をベースケースに特化しています。私はG ++ 5.4でコンパイルしたときにテンプレート特殊化のインスタンス化が正しくありません
#include <array>
#include <iostream>
template <std::size_t m>
struct B
{
std::array<double,m> arr;
};
template <std::size_t n, typename T>
struct A
{
std::array<T,n> arr;
const static int inner_dim = T::inner_dim;
};
template <std::size_t n >
template <std::size_t m>
struct A<n,B<m>>
{
std::array<B<m>,n> arr;
const static int inner_dim = m;
};
int main(int argc, char *argv[])
{
A<5,A<4,B<3>>> a;
std::cout << a.inner_dim << std::endl;
A<5,B<4>> b;
std::cout << b.inner_dim << std::endl;
return 0;
}
はしかし、メインでインスタンス化で、私は、次のエラーを取得する:
$ g++ -Wall --std=c++11 specialization.cc
specialization.cc: In instantiation of ‘const int A<4ul, B<3ul> >::inner_dim’:
specialization.cc:15:20: required from ‘const int A<5ul, A<4ul, B<3ul> > >::inner_dim’
specialization.cc:30:18: required from here
specialization.cc:15:20: error: ‘inner_dim’ is not a member of ‘B<3ul>’
const static int inner_dim = T::inner_dim;
^
specialization.cc: In instantiation of ‘const int A<5ul, B<4ul> >::inner_dim’:
specialization.cc:33:18: required from here
specialization.cc:15:20: error: ‘inner_dim’ is not a member of ‘B<4ul>’
決して専門、唯一の一般的な定義が使用されているようです。正しいスペシャライゼーションがインスタンス化されていることを確認するにはどうすればよいですか?
ノートでなければなりません:打ち鳴らすが試み専門 –