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

Why doesn't C++ find template function?

本文关键字:功能 C++ 找不到 为什么      更新时间:2023-10-16

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

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

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::迭代器?(接受的答案使用一些 C++11 类型,但您可以使用 C++03 等效类型,例如来自 Boost(