2017-02-07 6 views
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>’ 

決して専門、唯一の一般的な定義が使用されているようです。正しいスペシャライゼーションがインスタンス化されていることを確認するにはどうすればよいですか?

+0

ノートでなければなりません:打ち鳴らすが試み専門 –

答えて

6

私の推測では、

template <std::size_t n > 
template <std::size_t m> 
struct A<n,B<m>> 

では

template <std::size_t n, std::size_t m> 
struct A<n,B<m>> 
+0

はい、それはそれだを拒否します。奇妙な。私は前にそれを試みたと確信しています。ありがとう! – kalj

関連する問題