我总是发现C ++模板难以理解,而C ++错误信息更是如此。我想要了解它,而不是总是感到困惑。这是最新奇怪的体验:
error: conversion from ‘<unresolved overloaded function type>’ to non-scalar type ‘std::vector<int>::iterator {aka __gnu_cxx::__normal_iterator<int*, std::vector<int> >}’ requested
这个doozy来自以下代码:
#include <iostream>
#include <vector>
using namespace std;
template <typename T>
void printVector(const vector<T>& v) {
for (typename vector<T>::iterator iter = v.begin; iter != v.end; iter++) {
cout << *iter << endl;
}
}
int main() {
vector<int> v{1, 2, 3};
printVector(v);
return 0;
}
如果我使用基于C ++ 11范围的循环,迭代向量没有问题。我想学习如何使用迭代器来实现它。
有人可以解释错误的含义以及解决方法吗?
如果我能得到一本能很好地解释模板的书的推荐,那也很棒。
答案 0 :(得分:3)
请仔细查看错误消息。它说你正在尝试将函数转换为迭代器。您应该通过添加()
来调用它们。
更改
for (typename vector<T>::iterator iter = v.begin; iter != v.end; iter++) {
到
for (typename vector<T>::iterator iter = v.begin(); iter != v.end(); iter++) {
~~ ~~
答案 1 :(得分:1)
您错过了begin
和end
中的括号,并且由于您通过const引用传递了该向量,因此您需要const_iterator
。< / p>
template <typename T>
void printVector(const vector<T>& v) {
for (typename vector<T>::const_iterator iter = v.begin(); iter != v.end(); iter++) {
^^^^^^^^^^^^^^ ^^ ^^
cout << *iter << endl;
}
}
更好的是使用范围基数:
template <typename T>
void printVector(const vector<T>& v) {
for(auto &&e : v) {
cout << e << endl;
}
}
答案 2 :(得分:0)
std::vector<T>::begin
和::end
是函数;你需要打电话给他们:
for (typename vector<T>::iterator iter = v.begin(); iter != v.end(); iter++) {
// ^^ ^^
cout << *iter << endl;
}
此外,您正在尝试将const
迭代器转换为非const
迭代器。您需要使用vector<T>::const_iterator
,或者更好的是auto
。