为什么C ++没有找到模板功能?

时间:2013-08-18 17:01:48

标签: c++ function templates

为什么我会收到编译错误no matching function for call to `f( __gnu_cxx::__normal_iterator > >)'

#include <vector>

template<typename T>
void f(const typename std::vector<T>::iterator &) {}

void g() {
  std::vector<int> v;
  f<int>(v.end());  // Compiles.
  f(v.end());  // Doesn't compile, gcc 4.3 can't find any match.
}

最终我想编写一个只接受向量迭代器的函数,并且无法编译(带有意义的错误)其他任何东西。所以template<typename T>void f(const T&) {}不是一个好的解决方案,因为它也可以编译其他类型。

2 个答案:

答案 0 :(得分:4)

您无法从嵌套类型中推断出模板参数。想想,例如std::vector<T>::size_type总是std::size_t:编译器如何解决歧义?我意识到在你的例子中情况并非如此,但同样的原则适用。例如,std::vector<T>的迭代器类型可以是T*,它也可以是std::array<T, N>的迭代器类型。

答案 1 :(得分:3)

G ++ 4.8提供了更完整的消息:http://ideone.com/ekN3xs

note:   template argument deduction/substitution failed:
note:   couldn't deduce template parameter ‘T’

f不直接使用T(例如“const T&”)或T明确的类型(例如“const std::vector<T>& “)但是嵌套的依赖类型(此处为std::vector<T>::iterator),因此无法从参数中自动推导出模板类型T

编辑:Dietmar Kühl's answer提供了一个很好的理由示例。


对于“最终”部分,请检查How to check whether a type is std::vector::iterator at compile time?(接受的答案使用一些C ++ 11类型,但您可以使用C ++ 03等效,例如来自Boost)