下面的代码无法编译。 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);
}
答案 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 )
应该在这里工作得很好。如果您确实想要尝试以最初尝试的方式限制模板参数,那么就应该声明这个通用模板,然后尝试定义适当的专业化。