编译器</t>无法识别“typename vector <t> :: iterator”

时间:2013-10-17 04:00:23

标签: c++ templates typename

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

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 个答案:

答案 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_iteratorstd::vector<const T>::const_iterator,这可能是同一类型。

因此称为非推断的上下文。你必须明确你想要的模板。

答案 3 :(得分:1)

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

f<int>(v.begin());