2

为什么会出现编译错误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&) {}不是一个好的解决方案,因为它也可以为其他类型编译。

4

2 回答 2

4

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

于 2013-08-18T17:18:11.170 回答
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 的回答给出了一个很好的理由示例。


对于您的“最终”部分,请检查如何在编译时检查类型是否为 std::vector::iterator?(接受的答案使用一些 C++11 类型,但您可以使用 C++03 等价物,例如来自 Boost)

于 2013-08-18T17:20:46.100 回答