【问题标题】:How do I initialize a table inside a class definition?如何在类定义中初始化表?
【发布时间】:2017-09-11 04:12:34
【问题描述】:

我正在使用 C++ 11/14 (Visual Studio 2015) 构建解析器。如何在类中创建和初始化表,并让它计算表的长度?

我从编译器收到以下错误:

1>d:\temp\win32project1\win32project1\source1.cpp(49):警告 C4200:使用了非标准扩展:结构/联合中的零大小数组

1> d:\temp\win32project1\win32project1\source1.cpp(49):注意:该成员将被默认构造函数或复制/移动赋值运算符忽略

1>d:\temp\win32project1\win32project1\source1.cpp(49): error C2997: 'tlv::_requests': array bound cannot be deduced from an in-class initializer

1> d:\temp\win32project1\win32project1\source1.cpp(45): 注意:见 'tlv::_requests' 的声明

typedef enum _TLV_TYPE : UINT32
    {
    tlv_type_read,
    tlv_type_write,
    tlv_type_param,
    tlv_type_status
    } TLV_TYPE;

typedef struct
    {
    TLV_TYPE    type;
    UINT32      length;
    } TLV_RECORD, *pTLV_RECORD;

typedef std::function <UINT32 (pTLV_RECORD Record)> pTLV_PARSER;

typedef struct
    {
    TLV_TYPE            type;
    pTLV_PARSER         parse_routine;
    vector <TLV_RECORD> parameters;
    vector <TLV_RECORD> response;
    } TABLE, *pTABLE;

class tlv
{
public:
    tlv (SOCKET Socket);
    ~tlv ();
    UINT32 start_parse (pTLV_RECORD Record);

protected:
    pTLV_PARSER parse_read;
    pTLV_PARSER parse_write;

const TABLE _requests [] =
    {
        {tlv_type_read, parse_read, {{tlv_type_param, 4}, {tlv_type_param, 0}, {tlv_type_param, 4}}, {{tlv_type_status, 4}}},
        {tlv_type_write, parse_write,{{tlv_type_param, 4}}, {{tlv_type_status, 4}}},
    };

};  // End of class tlv

【问题讨论】:

  • 离题:大部分 typdefing 在 C++ 中是不需要的。
  • typedef struct/enum _foo { ... } foo; 是 C++ 中的反模式。编写定义的正确方法是enum TLV_TYPE : UINT32 { ... };。你正在做的typedef 废话用在 C 中,但不是 C++。
  • 此代码compiles fine for me。如果您遇到错误,请将它们包含在您的问题中。
  • @cdhowie,我收到以下错误:警告 C4200:使用了非标准扩展:结构/联合中的零大小数组注意:此成员将被默认构造函数或复制/移动赋值运算符错误忽略C2997: 'tlv_::_requests': 数组绑定不能从类内初始化器中推导出注:参见 'tlv_::_requests' 错误声明 C2229: 类 'tlv_' 有一个非法的零大小数组

标签: c++


【解决方案1】:

由于 cmets 中 @cdhowie 提供的链接中指定的原因,必须指定数组长度,因为 C++ 标准,出于委员会最了解的原因,对成员初始化器的方式有相当奇怪和不明显的规则处理(请参阅链接,以及链接中的链接),并且这些规则的解释因编译器而异。

【讨论】:

    【解决方案2】:

    存储指向成员函数的指针的类型声明如下:

    typedef int (tlv::*pTLV_PARSER)(pTLV_RECORD Record);
    

    我不清楚你的解析器函数究竟返回了什么,所以只在声明中使用了int 数据类型

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多