2016-04-28 17 views
2

Code unten kompiliert nicht. Die Zeilen 14 und 15 sind das Problem und ich weiß nicht, wie ich das beheben soll. Wie kann die Template-Funktion geändert werden, um dieses kleine Beispiel zu starten?Verschachtelte Vorlage und Vorlage Fehler in Fehler

Mein Compiler sagt:

error: no matching function for call to 'make' 

und

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

Kompilieren Sie diesen Code:

#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

Dies ist verwirrend: 'Node' enthält einen' Vektor > :: const_iterator ', den' make() 'aus' dataset.begin() 'zuweisen möchte, aber' dataset' ist ein 'vector ' not a ' Vektor > '. Wie sind diese kompatibel? –

Antwort

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

Grob gesagt, dies entspricht einer Vorlage selbst, wie std::vector, dass dauert die erforderlichen Template-Parameter. Es entspricht keiner Vorlageninstanz, wie std::vector<int>.

Ich sehe keine besondere Notwendigkeit, hier so kernig zu werden. Eine einfache

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

sollte hier gut funktionieren. Wenn Sie versuchen möchten, die Vorlagenparameter auf die Art und Weise zu beschränken, wie Sie es ursprünglich versucht haben, müssen Sie zunächst diese generische Vorlage deklarieren und dann versuchen, eine geeignete Spezialisierung zu definieren.

+0

Diese Lösung wird nicht funktionieren, da OP versucht, innerhalb der Funktion einen 'std :: vector > :: const_iterator' einem 'std :: vector :: const_iterator' zuzuordnen, und diese Typen sind nicht zuweisungskompatibel. – AndyG

+0

Das wäre das zweite Problem hier. Aber insofern, als hier der Ersatz der Template-Substitution gefragt wurde, ist dies der Grund dafür. –