为什么会出现编译错误 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.
}
最终我想编写一个函数,它只接受一个 vector 迭代器,并且无法编译(有一个有意义的错误)其他任何东西。所以template<typename T>void f(const T&) {}
这不是一个好的解决方案,因为它也可以为其他类型编译。
最佳答案
你不能从嵌套类型中推导出模板参数。想一想,例如 std::vector<T>::size_type
这总是 std::size_t
:编译器将如何解决歧义?我意识到您的示例中情况并非如此,但适用相同的原则。例如 std::vector<T>
的迭代器类型可以是T*
也可以是 std::array<T, N>
的迭代器类型.
关于c++ - 为什么C++找不到模板函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18301563/