0

现在我有一个这样的模板方法:

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” 。但这仍然是错误的。有谁知道如何解决这个问题?

4

4 回答 4

2

问题是 Template Argument Deduction 适用于大约 20 种不同的表格,但不适用于 form typename Foo<T>::Bar。原因是有无限多Foo的 s,它们中的每一个都可以有一个Bar与你的匹配的嵌套类型。编译器无法搜索所有这些。

这种问题的一个很好的例子是std::vector<T>::const_iteratorvs std::vector<const T>::const_iterator,它很可能是同一类型。

因此,它被称为非推断上下文。你必须明确你想要哪个模板。

于 2013-10-17T08:03:16.067 回答
2

您的函数需要一个迭代器,但您正在尝试传递一个向量。你可能有这样的意思f(v.begin())

此外,正如@chris 所指出的,T它处于不可演绎的上下文中。它必须明确提供,如f<int>(v.begin());

于 2013-10-17T04:02:01.227 回答
1

修复编译器错误的一种方法是明确模板参数。

f<int>(v.begin());
于 2014-08-13T03:41:35.923 回答
0

你通过了vwhich is vector<int>to function f。您应该将迭代器传递给f.

只需重新设计您的模板功能

template<typename Iterator>
void f(Iterator it)
{ 
   // manipulate iterator it
}

那么你可以打电话

vector<int> v;

f(v.begin());
于 2013-10-17T04:02:53.293 回答