2016-04-28 10 views
2

部分テンプレートの特殊化に問題があります。C++で部分テンプレートの特殊な特殊化を選択できません

私はこの小さなヘルパーテンプレートと部分的な特殊化があります。

template<typename T> 
struct ctor_std_vector_get 
{ 
    static_assert(false,"ERROR"); 
}; 


template<typename T> 
struct ctor_std_vector_get<const std::vector<T>> 
{ 
    static const T& get(const T& x){ 
     return x; 
    } 
}; 

をそして、私はそれをこのようなものを使用します。ときに私

template<typename T> 
class container 
{ 
    public: 

    container(const std::vector<T>& inp): 
    { 
     alloc(); 

     for(const T& t : inp){ 
      const T& x = ctor_std_vector_get<T>::get(t); 
     } 
    } 
} 

をしかし、私は、コンパイル時に、私は、static_assertを打ちます部分的な専門化が必要です。部分的な特殊化が一致した場合、それは基本テンプレートの前に選択されるため、私は何か間違ったことをしたと思います。どうしましたか?

答えて

3
container(const std::vector<T>& inp): 
{ 
    alloc(); 

    for(const T& t : inp){ 
     const T& x = ctor_std_vector_get<T>::get(t); 
    } 
} 

この関数のパラメータとしてstd::vector<int>を渡したとします。

したがって、const std::vector<T>&T部分は、intとなります。単純な置換。

今、私たちはTはあなたがctor_std_vector_get<T>、またはctor_std_vector_get<int>は、デフォルトのテンプレート、または特殊化を使用して巻き上げることを期待していないテンプレートint、で置換されていることを確立してきたということ?

+0

ご返信ありがとうございます。 私はcppreferenceを読んでいるというアイデアは、基本テンプレート(static_assertを持つテンプレート)が見つかると、コンパイラは(部分的に)特殊化を探します。その中で私が必要とする部分的な特殊化はあります –

+0

あなたのアイデアは絶対に100%正しいです。私の質問に答えようとすると、テンプレートパラメータが 'int'であり、' std :: vector 'ではなく、デフォルトテンプレートが' T'が 'int'なので、あなたの答えになるでしょう。 –

+0

もう一度ありがとう。私はそれを持っていると思う、ctor_std_vector_get >。しかし、今私はフォローアップの質問があります。これが動作しても、私はまだstatic_assertを取得しますが、コンパイルされていない基本テンプレートではありませんか? –

関連する問題