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