简体   繁体   English

无法在结构中定义 3D 向量

[英]Cannot define a 3D vector in a struct

When i define my vector in this way当我以这种方式定义我的向量时

#include<iostream>
#include<vector>
using namespace std;
typedef std::vector<char> Image1D;
typedef std::vector<Image1D> Image2D;
typedef std::vector<Image2D> Image3D;

int main()
{

  Image3D image2(10, std::vector<std::vector<char>>(10, std::vector<char>(10, 0)));
  return 0;
}

every thing works fine but when i define the same vector in a struct if give me some error in terms of type specifier it have problem with this const value 10一切正常,但是当我在结构中定义相同的向量时,如果在类型说明符方面给我一些错误,则此 const 值 10 有问题

#include<iostream>
#include<vector>

using namespace std;
typedef std::vector<char> Image1D;
typedef std::vector<Image1D> Image2D;
typedef std::vector<Image2D> Image3D;




struct CameraImages
{
   Image3D image2(10, std::vector<std::vector<char>>(10, std::vector<char>(10, 0)));
};

any help would be highly appreciated任何帮助将不胜感激

The initialization of the data member of the structure is invalid.结构数据成员的初始化无效。

struct CameraImages
{
   Image3D image2(10, std::vector<std::vector<char>>(10, std::vector<char>(10, 0)));
};

You have to use a brace-or-equal initializer.您必须使用大括号或等号初始化程序。

From the C++ 17 Standard (12.2 Class members)来自 C++ 17 个标准(12.2 个 Class 成员)

member-declarator:
    declarator virt-specifier-seqopt pure-specifieropt
    declarator requires-clause
    declarator brace-or-equal-initializeropt
    identifieropt attribute-specifier-seqopt : constant-expression brace-or-equal-initializeropt

For example例如

struct CameraImages
{
   Image3D image2 {10, std::vector<std::vector<char>>(10, std::vector<char>(10, 0))};
};

or或者

struct CameraImages
{
   Image3D image2 = {10, std::vector<std::vector<char>>(10, std::vector<char>(10, 0))};
};

or或者

struct CameraImages
{
   Image3D image2 = Image3D(10, std::vector<std::vector<char>>(10, std::vector<char>(10, 0)));
};

image2 is a member, you can set up default initialization something like: image2 是成员,您可以设置默认初始化,例如:

struct CameraImages
{
   Image3D image2 = Image3D(10, std::vector<std::vector<char>>(10, std::vector<char>(10, 0)));
};

you could use brace initialization also like你也可以使用大括号初始化

struct CameraImages
{
   Image3D image2 = {(10, std::vector<std::vector<char>>(10, std::vector<char>(10, 0)))};
};

but the former is probably clearer.但前者可能更清楚。

As an aside: this approach will have some significant performance implications for image operations.顺便说一句:这种方法将对图像操作产生一些重要的性能影响。

struct CameraImages
{
   Image3D image2(10, std::vector<std::vector<char>>(10, std::vector<char>(10, 0)));
};

This is a function declaration.这是一个 function 声明。

To prevent a syntax ambiguity such as Most vexing parse , any member declaration like T t(args...) is not allowed.为了防止语法歧义,例如Most vexing parse ,不允许任何成员声明,例如T t(args...)

In short, in order to fix your problem, you have to declare it as either these forms.简而言之,为了解决您的问题,您必须将其声明为这些 forms。

Image3D image2{10, std::vector<std::vector<char>>(10, std::vector<char>(10, 0))};
Image3D image2 = Image3D(10, std::vector<std::vector<char>>(10, std::vector<char>(10, 0)));

For more information, you may check Why can in-class initializers only use = or {}?有关更多信息,您可以查看为什么类内初始化程序只能使用 = 或 {}?

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM