【问题标题】:c++ initialize 2d vector with a new class ; default value changec++ 用新类初始化二维向量;默认值更改
【发布时间】:2019-09-05 12:41:57
【问题描述】:

我想初始化一个二维向量,但我不断收到错误消息

如果我写这段代码

unsigned long size = 101;
double initialmPo = 63;

std::vector<std::vector<Soil> > matrixPotential(
              size, std::vector<Soil>(size));

我没有问题 但是如果我写这段代码

    std::vector<std::vector<Soil> > matrixPotential(
              size, std::vector<Soil>(size, initialmPo));

我得到消息

no matching constructor for initialization of  std::vector< Soil >

我想要一个 101*101 的向量,向量内部是 63 的值(数字)。

那是我的土壤课

class Soil
{
public:
    Soil();
    double A;
    double B;
    double C;
    double D;
};

#endif // SOIL_H

我该怎么办?

【问题讨论】:

  • 请通过添加所需的#includes 和主函数来提供minimal reproducible example
  • 在重载模板函数中进行选择时(在这种情况下,vector&lt;Soil&gt; 的构造函数编译器不会查看转换。没有构造函数将 double 作为其第二个参数。要么更改initialmPo 的类型为 int 或在您的代码中将其转换为 int

标签: c++ class vector 2d default


【解决方案1】:

您的代码不起作用,因为 initialmPo 不是有效的 Soil 实例。你需要的std::vectorconstructor

explicit vector( size_type count,
                 const T& value = T(),
                 const Allocator& alloc = Allocator());     (until C++11)

         vector( size_type count,    
                 const T& value,
                 const Allocator& alloc = Allocator());     (since C++11)

为此,您应该将所需的Soil 元素作为第二个参数传递。在您的类中,您应该定义一个构造函数,该构造函数负责使用所需值初始化字段。或者您应该消除无参数构造函数并选择aggregate initialization

示例(带有构造函数)

#include <vector>

class Soil
{
public:
    double A;
    double B;
    double C;
    double D;
    Soil(double in) : A{in}, B{in}, C{in}, D{in} { }
};


int main()
{
  unsigned long size = 101;
  double initialmPo = 63;
  Soil s(initialmPo);
  std::vector<std::vector<Soil> > matrixPotential(
              size, std::vector<Soil>(size, s));

  return 0;
}

live

示例(带有聚合初始化)

#include <vector>

class Soil
{
public:
    double A;
    double B;
    double C;
    double D;
};


int main()
{
  unsigned long size = 101;
  double initialmPo = 63;
  Soil s{initialmPo, initialmPo, initialmPo, initialmPo};
  std::vector<std::vector<Soil> > matrixPotential(
              size, std::vector<Soil>(size, s));

  return 0;
}

live

【讨论】:

  • 你能重现他的问题吗?我不能。那你怎么能提供答案呢?
  • @MarekR 问题出在问题的第二个示例中,does not compile
  • 好的,现在我看到了问题:) 谢谢。
  • 在第二个示例中,Soil s{initialmPo, initialmPo, initialmPo, initialmPo}; 再次出现错误,没有匹配的构造函数用于初始化土壤
  • 但是从第一个例子中,我没有看到任何错误!!!太感谢了!也感谢您的好意和良好的解释!谢谢你:)
猜你喜欢
  • 1970-01-01
  • 2013-11-04
  • 1970-01-01
  • 2018-06-26
  • 1970-01-01
  • 2021-10-02
  • 1970-01-01
  • 2023-03-18
  • 1970-01-01
相关资源
最近更新 更多