【问题标题】:Cannot define a 3D vector in a struct无法在结构中定义 3D 向量
【发布时间】:2019-10-02 16:06:10
【问题描述】:

当我以这种方式定义我的向量时

#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;
}

一切正常,但是当我在结构中定义相同的向量时,如果在类型说明符方面给我一些错误,那么这个 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)));
};

任何帮助将不胜感激

【问题讨论】:

    标签: c++ c++11 vector struct initialization


    【解决方案1】:

    结构体数据成员的初始化无效。

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

    你必须使用大括号或等号初始化器。

    来自 C++ 17 标准(12.2 类成员)

    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
    

    例如

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

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

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

    【讨论】:

      【解决方案2】:

      image2 是一个成员,你可以设置默认初始化类似:

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

      你也可以使用大括号初始化

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

      但前者可能更清楚。

      顺便说一句:这种方法将对图像操作产生一些重要的性能影响。

      【讨论】:

        【解决方案3】:
        struct CameraImages
        {
           Image3D image2(10, std::vector<std::vector<char>>(10, std::vector<char>(10, 0)));
        };
        

        这是一个函数声明。

        为防止出现Most vexing parse 等语法歧义,不允许使用T t(args...) 等任何成员声明。

        简而言之,为了解决您的问题,您必须将其声明为这两种形式。

        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)));
        

        更多信息,您可以查看Why can in-class initializers only use = or {}?

        【讨论】:

          猜你喜欢
          • 2019-06-10
          • 1970-01-01
          • 2020-08-09
          • 1970-01-01
          • 1970-01-01
          • 2018-05-29
          • 2017-06-13
          • 2022-11-15
          • 2017-11-23
          相关资源
          最近更新 更多