【问题标题】:C++ pass generic vector as function parameterC++ 将泛型向量作为函数参数传递
【发布时间】:2021-09-23 09:33:32
【问题描述】:

我对 C++ 和模板还很陌生。我不认为它不起作用的原因很复杂,但我就是不明白。

void print(vector<> v) {
    return;
}

无法编译并出现错误

error: wrong number of template arguments (0, should be at least 1)

然而

void print(vector<int> v) {
    return;
}

不会产生这样的错误。

这是为什么呢?

【问题讨论】:

  • 因为需要提供模板参数...?编译器无法为您决定。也许您可以详细说明为什么您认为第一个示例应该有效。
  • 我认为 vector 可以存储任何类型的变量,例如 v.push_back(int); v.push_back(浮动); (显然,这不是它的工作原理......)

标签: c++ templates vector


【解决方案1】:

如果您需要存储不同类型的元素,您应该研究多态性和类层次结构。例如,如果您有两个不同的类 A 和 B,并且需要一个向量来保存其中任何一个,您可以确保它们共享一个公共基类。 然后,您可以将此类对象的指针或引用存储在同一个向量中,就像这样(在这种情况下使用智能指针):

#include <iostream>
#include <memory>
#include <vector>

class Base {
  public:
    virtual ~Base() {}
    virtual void print() = 0;
};
using BasePtr = std::shared_ptr<Base>;

class A : public Base {
  public:
    virtual void print() override { std::cout << "I'm an A" << std::endl; }
};
class B : public Base {
  public:
    virtual void print() override { std::cout << "I'm a B" << std::endl; }
};

void print(const std::vector<BasePtr>& v) {
  for (auto&& i : v)
    i->print();
}

int main()
{
  std::vector<BasePtr> v;
  v.push_back(std::make_shared<A>()); /* create and add an element of type A */
  v.push_back(std::make_shared<B>()); /* create and add an element of type B */
  print(v);
}

(另外,请注意我将 vector 类型作为 const 引用传递,否则它会在传递到函数之前被复制。)

【讨论】:

    【解决方案2】:

    你必须让你的函数template接受不止一种类型:

    template <typename T>
    void print(vector<T> v) {
        return;
    }
    

    如果您来自另一种语言(我认为 Java 使用您提出的语法?),我建议您向 a good C++ book 学习。与尝试在 C++ 中应用其他语言的知识相比,从一开始就正确学习要少得多。

    【讨论】:

    • vector&lt;&gt; 可以,如果有默认值,但没有,对吧?也许值得一提。
    • 会这样做,谢谢。我只是有一个错误的想法,向量可以将不同的数据类型存储在一个变量中......
    • 不,vector&lt;&gt; 即使有默认值也不行。它不会引发错误,但也不会执行 OP 的预期,即实现通用函数。相反,该函数仅适用于默认向量。
    • @ChristophLipka op 来自 Java 只是一个猜测。我刚刚提到它是因为答案谈到了语法,但语法方面的 some_template&lt;&gt; 在 C++ 中也可以。没关系,也许我的评论不清楚。
    猜你喜欢
    • 2019-03-05
    • 2022-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-29
    • 2015-03-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多