2016-04-28 65 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'包含一個從'dataset.begin()'分配''的矢量> const_iterator'',但'dataset'是'vector '而不是'矢量>'。這些如何兼容? –

回答

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

這將是這裏的第二個問題。但是,就在這裏被問到的模板替換失敗而言,這就是原因。 –