2016-04-28 4 views
2

以下のコードはコンパイルされません。 14行目と15行目は問題で、どのように修正するのか分かりません。この小さなサンプルを実行するために、テンプレート化された関数をどのように変更できますか?入れ子のテンプレートとテンプレートの推測エラー

私のコンパイラは言う:

error: no matching function for call to 'make' 

note: candidate template ignored: couldn't infer template 
     argument 'CONTAINER' 

は、このコードをコンパイル:

#include <vector> 

template <typename TYPE> 
struct Node 
{ 
    Node(TYPE & _value) : value(_value) {}; 
    TYPE value; 
    typename std::vector<Node<TYPE>>::const_iterator first, last; 
}; 

template < template <typename, typename...> class CONTAINER 
     , typename TYPE 
     , typename... ARGS > 
Node<TYPE> & make (Node<TYPE> & _node 
/* not correct */ , typename CONTAINER<TYPE, ARGS...>::const_iterator _first 
/* not correct */ , typename CONTAINER<TYPE, ARGS...>::const_iterator _last 
        , unsigned _k) 
{ 
    if (std::distance(_first,_last) < _k) 
    { 
     _node.first = _first; 
     _node.last = _last; 
    } 
    return _node; 
} 

int main() 
{ 
    unsigned k = 3; 
    std::vector<int> dataset; 
    int i = 4; 
    Node<int> node(i); 
    node = make(node, dataset.begin(), dataset.end(), k); 
} 
+1

'Node'は、' make() 'が' dataset.begin() 'から割り当てようとしている'ベクトル :: const_iterator'を含んでいますが、 'dataset'は'ベクトル 'ベクター> '。これらはどのように互換性がありますか? –

答えて

1
template <typename, typename...> class CONTAINER 

大まかに言えば、これはという、std::vectorのように、テンプレート自体にマッチしますテイク必要なテンプレートパラメータテンプレートインスタンスと一致しません(std::vector<int>など)。

私は特にここでぎこちないようにする必要は特にありません。単純

template <typename ITERATOR, typename TYPE> 
Node<TYPE> & make (Node<TYPE> & _node, 
        ITERATOR first, ITERATOR last, unsigned _k) 

はここでうまくいくはずです。最初にやろうとしていたやり方で、テンプレートパラメータを制限しようとする場合、この汎用テンプレートを宣言してから、適切な特殊化を定義しようとします。

+0

最終的にOPが関数内の 'std :: vector :: const_iterator'を' std :: vector :: const_iterator'に代入しようとしているので、この解決法は機能しません。 – AndyG

+0

これはここで2番目の問題です。しかし、ここで尋ねられていたテンプレート置換の失敗の限りでは、これが理由です。 –

関連する問題