如何在类定义中初始化表?

时间:2017-04-14 21:14:40

标签: c++

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

我从编译器中得到以下错误:

  

1> d:\ temp \ win32project1 \ win32project1 \ source1.cpp(49):警告C4200:使用非标准扩展名:struct / union中的零大小数组

     

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

     

1> d:\ temp \ win32project1 \ win32project1 \ source1.cpp(49):错误C2997:'tlv :: _ requests':无法从类内初始值设定项中推导出数组绑定

     

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

2 个答案:

答案 0 :(得分:0)

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

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

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

答案 1 :(得分:0)

由于@cdhowie在注释中提供的链接中指定的原因,必须指定数组长度,因为C ++标准,出于委员会最熟悉的原因,对成员初始化器的方式有相当奇怪和非显而易见的规则处理(参见链接和链接中的链接),这些规则的解释因编译器而异。