0

我必须创建一个接收未知项目类型向量的函数。这是我的代码:

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);

当我尝试编译此代码时,出现以下错误:

练习1_1.cpp:在函数“int main()”中:
练习1_1.cpp:33:15:错误:没有匹配函数调用“<code>printVector(std::vector<int>&)”<br>练习1_1。 cpp:33:15: 注意:候选人是:
exercise1_1.cpp:13:7: 注意:template<class S> void printVector(std::vector<S*>)

4

2 回答 2

3

您的代码中有一些错误。让我们看看它们:

  • 在 的签名中printVector,您采用类型的参数vector<S*>。这意味着,对于给定的 type S,您需要一个指向 的指针向量S。因此,例如,如果类型是int,您应该“发送” a vector<int*>。在您的示例中,您正在尝试“发送” a vector<int>,因此 of 的签名printVector应如下所示:

    template <typename S>
    void printVector(vector<S> c)
    
  • A在您的 for 循环中,您再次将变量声明为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;
}
于 2012-11-08T23:12:02.253 回答
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";
}

修复:

  • 您的函数被声明为采用 avector<S*>但您显然希望它采用vector<S>
    • 您的 main 函数调用 print_vector 的参数std::vector<int>。由于 anint不是S*任何类型的S,因此该模板不适用。
  • A当您打算仅使用第一个声明时,您已重新声明。
  • 您将向量的索引访问与通过迭代器的访问混为一谈。
    • 如果你有一个int:c[i]
    • 如果你有一个迭代器:*it

不太重要的修复:

  • 避免using namespace std;
  • std::endl当你的意思是永远不要使用"\n"
  • 您应该通过 const 引用而不是值来传递参数
于 2012-11-08T23:02:44.607 回答