我必须创建一个接受未知项目类型 vector 的函数。 这是我的代码:
template <typename S>
void printVector(vector<S*> c){
typename vector<S>::const_iterator A = c.begin();
for (int A; A != c.end(); A++){
cout<<c[A]<<" ";
}
cout<<endl;
}
在我的主类中,这是我的 vector 和函数调用:
vector<int> x;
int j=5;
for(int i=0;i<j;i++){
x.push_back(num[i]);
}
printVector(x);
当我尝试编译这段代码时,出现了这些错误:
exercise1_1.cpp: In function ‘int main()’:
exercise1_1.cpp:33:15: error: no matching function for call to ‘printVector(std::vector<int>&)
’
exercise1_1.cpp:33:15: note: candidate is:
exercise1_1.cpp:13:7: note:template<class S> void printVector(std::vector<S*>)
最佳答案
您的代码中存在一些错误。让我们看看它们:
在
printVector
的签名中,您采用vector<S*>
类型的参数.这意味着,对于给定类型S
,你采用指向S
的指针 vector .因此,例如,如果类型是int
,你应该“发送”一个vector<int*>
.在您的示例中,您正试图“发送”vector<int>
, 所以printVector
的签名应该是这样的:template <typename S> void printVector(vector<S> c)
在您的 for 循环中,您正在声明变量
A
再次,作为int
.在 C++ 标准库中,您可以使用迭代器访问 vector 中的每个项目,或者像访问数组一样访问它们。你把这两种东西混在一起了。
如果你想使用迭代器循环,它应该是这样的:
typename vector<S>::const_iterator a = c.begin();
for (; a != c.end(); a++){
cout<<*a<<" ";
}
这意味着,对于 vector 中的每个项目,打印它的值(注意我使用了 *a
因为我使用的是迭代器)。
或者使用基于索引的方法:
for (int i = 0; i < c.size(); i++){
cout<<c[i]<<" ";
}
此外,作为 C++ 社区的常见做法,在接收非原始类型的变量时使用 const 引用。这可以防止执行对象的拷贝,因此在处理大型集合时它可能会更快。示例:
void printVector(const vector<S>& c)
所以这是一个完整的工作示例:
#include <vector>
#include <iostream>
using namespace std;
template <typename S>
void printVector(const vector<S>& c){
for (int i = 0; i < c.size(); i++){
cout<<c[i]<<" ";
}
cout<<endl;
}
int main(int argc, char** args) {
vector<int> x;
int j=5;
for(int i=0;i<j;i++){
x.push_back(i);
}
printVector<int>(x); // Can be printVector(x); too
return 0;
}
关于c++ - 作业 : C++ Templates With Vectors,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13299330/