我必须创建一个接收未知项类型向量的函数。 这是我的代码:
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<int> x;
int j=5;
for(int i=0;i<j;i++){
x.push_back(num[i]);
}
printVector(x);
当我尝试编译此代码时,我收到了以下错误:
exercise1_1.cpp:在函数'int main()'中:
exercise1_1.cpp:33:15:错误:没有匹配函数来调用“printVector(std::vector<int>&)
” exercise1_1.cpp:33:15:注意:候选人是:
exercise1_1.cpp:13:7:注意:template<class S> void printVector(std::vector<S*>)
答案 0 :(得分:3)
您的代码中存在一些错误。我们来看看它们:
在printVector
的签名中,您采用vector<S*>
类型的参数。这意味着,对于给定类型S
,您可以使用指向S
的指针。因此,例如,如果类型为int
,则应“发送”vector<int*>
。在您的示例中,您尝试“发送”vector<int>
,因此printVector
的签名应如下所示:
template <typename S>
void printVector(vector<S> c)
在for循环中,您再次声明变量A
,为int
。在C ++标准库中,您可以使用迭代器访问向量中的每个项目,或者只是像数组一样访问它们。你混合了两件事。
如果要使用迭代器循环,它应如下所示:
typename vector<S>::const_iterator a = c.begin();
for (; a != c.end(); a++){
cout<<*a<<" ";
}
这意味着,对于向量中的每个项目,打印其值(通知我使用*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;
}
答案 1 :(得分:2)
template <typename S>
void printVector(const std::vector<S>& c){
typename std::vector<S>::const_iterator A = c.begin();
for (; A != c.end(); A++){
std::cout<<*A<<" ";
}
std::cout<<"\n";
}
修正:
vector<S*>
,但您显然希望它采用vector<S>
。
std::vector<int>
的print_vector。由于任何类型的int
S*
都不是S
,因此模板不适用。A
。c[i]
*it
不太重要的修复:
using namespace std;
std::endl
。"\n"