现在我有一个这样的模板方法:
template<typename T>
void f(typename vector<T>::iterator it)
{
//implemenation
...
}
int main()
{
vector<int> v;
//initialization of v;
...
f(v.begin());
return 0;
}
但是当我编译为“g ++ THIS_FILE -o TARGET_RUNNABLE”时,编译说
no matching function for call to ‘f(std::vector<int>::iterator)’
template argument deduction/substitution failed:
couldn't deduce template parameter ‘T’
我确实在vector :: iterator之前添加关键字“typename”。但它仍然是错误的。有人知道如何解决这个问题吗?
答案 0 :(得分:2)
你的函数需要一个迭代器,但是你试图传递一个向量。您可能意味着f(v.begin())
或类似的东西。
另外,正如@chris所说,T
处于不可导出的背景中。它必须明确提供,如f<int>(v.begin());
答案 1 :(得分:1)
您将v
vector<int>
传递给了f
。您应该将迭代器传递给f
。
只需将模板功能重新设计为
即可template<typename Iterator>
void f(Iterator it)
{
// manipulate iterator it
}
然后你可以打电话
vector<int> v;
f(v.begin());
答案 2 :(得分:1)
问题在于模板参数演绎适用于大约20种不同的形式,但不适用于typename Foo<T>::Bar
形式。原因是存在无限多Foo
个,并且它们中的每一个都可以具有与您匹配的嵌套类型Bar
。编译器无法搜索所有这些。
此类问题的一个很好的例子是std::vector<T>::const_iterator
与std::vector<const T>::const_iterator
,这可能是同一类型。
因此称为非推断的上下文。你必须明确你想要的模板。
答案 3 :(得分:1)
修复编译器错误的一种方法是明确模板参数。
f<int>(v.begin());