【问题标题】:Writing a struct template with two vectors用两个向量编写结构模板
【发布时间】:2020-03-28 20:27:25
【问题描述】:

我想要实现的是创建一个结构 myVector 的模板,该模板将包含两个向量,即 vector_a 和 vector_b。但我对模板很陌生。我的意思是,我知道在某些情况下为什么以及何时更喜欢使用模板,但我不太确定如何解决这个问题。我写的是:

'''

#include<iostream>
#include<stddef.h>
#include<vector>


template <typename T> struct myVector {

    std::vector<T> vector_a;
    std::vector<T> vector_b;

};


int main() {

    myVector<int> z1(5);
    myVector<int> z2(6);
}

''' 我最终收到错误,例如调用“VectorXY::VectorXY(int)”时没有匹配函数 为向量 VectorXY z2(6);

因此,我非常感谢您的帮助。提前致谢。

【问题讨论】:

  • 您显示的代码中没有VectorXY,但在错误消息中引用了它。请提供实际的minimal reproducible example 和确切示例生成的错误消息。
  • 除此之外,错误信息非常清楚。 myVector 的什么构造函数你希望用于myVector&lt;int&gt; z1(5);?您还没有声明任何构造函数。它与模板无关,而与类的工作方式有关。

标签: c++ templates vector struct


【解决方案1】:

您的错误与模板无关。考虑以下代码

struct Int { int i; };

int main()
{
  Int z(1); // doesn't compile
}

你得到了错误,no matching constructor Int(int)

类是对其他事物的抽象。在这种情况下,intInt 似乎很明显是同一件事,构建一个应该就像构建另一个一样。但是编译器不知道,所以你需要提供一个构造函数,将参数传递给成员。

struct Int 
{ 
  int i; 
  Int(int n) : i(n) {}
};

请注意,在 C++20 中,编译器实际上能够确定您想要使用每个构造函数参数来初始化类的相应成员,因此即使没有提供构造函数,Int 也可以工作比如int

但是,即使在这种情况下,您的代码也不会工作,因为您需要使用更复杂的规则来构建您的成员。在你的情况下,你需要类似的东西

myVector(int n) : vector_a(n), vector_b(n) {} 

假设您希望使用传递给构造函数的值来构造内部向量。根据您的调用代码,这似乎是您想要的,但您可以在构造函数中编写任何逻辑。

【讨论】:

  • 快速说明:由于新的聚合初始化规则,您的第一个示例将在 C++20 中编译,但 OP 仍然不会。
  • @yashrunwal 如果您无法在评论中表达您想要表达的内容,请尝试将新信息编辑到问题中(但不要覆盖已经存在的内容)。您可以通过点击下方的“编辑”或here来编辑您的问题。
  • 所以我试图实现的是编写一个带有 2 个向量的结构。正如您建议的@walnut,我在代码中添加了一个构造函数。主要是当我调用函数时,我想将一个向量传递给我的结构模板,然后它会为我创建一个向量。目前主要是 'myVector vec_a(1), vec_b(2)' 之后,当我尝试打印向量 'std::cout 'operator 不匹配。这是什么错误?
  • @yashrunwal 这是一个与此无关的新问题。但它在这方面已经有很多答案,例如herehere。您需要为您的班级重载 &lt;&lt; 运算符。这些东西也应该在你的教科书中进行解释,如果你还没有遵循教科书,那么你应该开始学习,例如one of the recommended books.
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-03-16
  • 1970-01-01
  • 2017-06-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-25
相关资源
最近更新 更多