【问题标题】:I am getting a C++ error saying saying my class constructor argument types don't match my parameter types我收到一个 C++ 错误,说我的类构造函数参数类型与我的参数类型不匹配
【发布时间】:2019-04-14 10:28:45
【问题描述】:

这是我的构造函数代码:

vertex_array(float* &vertex_buffer, std::string& texture_file);

这是我的主要应用程序代码:

float cube1[] = { 0.5f, -0.5f,  0.5f,  1.0f,  0.0f,
                  0.5f, -0.5f, -0.5f,  1.0f,  1.0f,
                 -0.5f, -0.5f, -0.5f,  0.0f,  1.0f,
                 -0.5f, -0.5f,  0.5f,  0.0f,  0.0f,

                  0.5f,  0.5f,  0.5f,  1.0f,  0.0f,
                  0.5f,  0.5f, -0.5f,  1.0f,  1.0f,
                 -0.5f,  0.5f, -0.5f,  0.0f,  1.0f,
                 -0.5f,  0.5f,  0.5f,  0.0f,  0.0f };

vertex_array va_1(cube1, "blocks.png");

我收到错误:没有构造函数“vertex_array::vertex_array”的实例与参数列表参数类型匹配:(float[40], const char[11])

我花了大约一个小时来寻找问题,但我找不到代码有任何问题。我什至查看了另一个示例,该示例传递了完全相同的参数类型,但传递给了 const void* 类型的参数,它在该示例上有效,但不适用于我。我的问题是什么?

【问题讨论】:

  • float* & - 为什么
  • 正如@JesperJuhl 提到的,您的构造函数接口似乎需要一个输出参数,您将数组传递给而不是指向数组的指针。
  • 另外,你想要const std::string& texture_file
  • Jesper Juhl 和 Bo R,参数类型是 float* & 因为我将传入一个指向浮点数组的指针,我很确定数组名称是指向数组第一个索引的指针这是我传入的,然后我将其作为参考,因为我不希望它被复制

标签: c++ types parameters constructor arguments


【解决方案1】:

你给构造函数的第一个参数是一个指向floats的指针,第二个是const char*,它将被隐式转换为const std::string,所以你需要相应地更改签名:

vertex_array(float* vertex_buffer, const std::string& texture_file);

您也可以删除 texture_file 的引用声明以使其有效,但如果您稍后要使用真正的 std::string 实例化顶点数组,则会导致不必要的复制构造,因此请使用 const参考。

如果您有不同大小的 vertex_buffers,您也需要提供大小作为参数,或者考虑使用std::initializer_list 或容器来跟踪元素的数量。

例子:

vertex_array(std::initializer_list<float> vertex_buffer, const std::string& texture_file);

vertex_array va_2(
                { 0.5f, -0.5f,  0.5f,  1.0f,  0.0f,
                  0.5f, -0.5f, -0.5f,  1.0f,  1.0f,
                 -0.5f, -0.5f, -0.5f,  0.0f,  1.0f,
                 -0.5f, -0.5f,  0.5f,  0.0f,  0.0f,

                  0.5f,  0.5f,  0.5f,  1.0f,  0.0f,
                  0.5f,  0.5f, -0.5f,  1.0f,  1.0f,
                 -0.5f,  0.5f, -0.5f,  0.0f,  1.0f,
                 -0.5f,  0.5f,  0.5f,  0.0f,  0.0f}, "blocks.png");

【讨论】:

  • 好的,感谢您的建议,它已经修复了我的错误,但是我仍然不完全理解您对我的代码为什么不起作用的说法。那么首先,为什么我不能引用数组?其次,为什么字符串必须是 const?我想你可能已经解释过了,但是我没有完全理解你的解释,例如“您还可以删除 texture_file 的引用声明以使其有效”,为什么它以前无效?
  • 不,当您将 C 样式数组作为参数传递时,它会衰减为指向第一个元素的指针,因此您将丢失大小信息。我希望保留大小信息,使用 C++ 容器或 initializer_list 会更容易。 "blocks.png"const char*。当隐式转换为const std::string 时,常量将被保留,这就是为什么您不能将其作为std::string&amp; 接收的原因。它会抛弃 constness。
  • 好的,所以我已经添加了一个大小变量,但是其余的数组索引仍然可以在构造函数中访问吗?此外,我不希望使用 initializer_list 或容器,因为我不熟悉它们,并且希望我的代码不包含我熟悉的代码。
  • 另外,为什么“blocks.png”是一个 const char*?我没有给它任何类型,它只是我眼中的一个字符串。
  • 我不确定我是否理解您所说的其余数组索引是什么意思。您有一个指向第一个 float 的指针,可能还有一个指向元素数量的 size_t。这就是你得到的和你需要的一切。查看string literal 中描述文字字符串类型的第 1 条。
【解决方案2】:

我认为您可能错误地使用了您的运营商地址&amp;

从声明中删除它们并重试。

将它们用于数组是毫无意义的,并且实际上会抵消您想要实现的目标。第二个参数也不正确,因为您正在尝试获取 r 值的地址。

【讨论】:

  • 这不是运算符的“地址”。这是一个引用声明。
  • 好吧,在这种情况下,我想更正您的两个意见。以这篇文章为例。 quora.com/…
猜你喜欢
  • 2021-08-17
  • 1970-01-01
  • 2021-12-09
  • 1970-01-01
  • 2021-07-30
  • 1970-01-01
  • 2017-03-07
  • 2018-09-10
  • 2018-01-31
相关资源
最近更新 更多