嵌套模板和模板推断错误

时间:2016-04-28 10:58:31

标签: c++ templates

下面的代码无法编译。 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 个答案:

答案 0 :(得分: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 )

应该在这里工作得很好。如果您确实想要尝试以最初尝试的方式限制模板参数,那么就应该声明这个通用模板,然后尝试定义适当的专业化。