【问题标题】:Error C228: left of "must have class/struct/union several times错误 C228:“必须多次拥有类/结构/联合”的左侧
【发布时间】:2016-08-03 18:31:46
【问题描述】:

我们正在尝试使用以下代码序列化列表:

28  class MessageSerializer
29  {
30  public:
31      MessageSerializer(const Message& messageStruct)
32        : m_msgRef(messageStruct)
33        , m_userLength(m_msgRef.user_name.length())
34        , m_msgLength(m_msgRef.content.length())
35        {}
36       
37  
38        size_t RequiredBufferSize() const
39        {
40            return sizeof(int) + sizeof(size_t)*2 + m_msgLength +m_userLength;
41        }
42    
43        void Serialize(void* buffer) const
44        {
45            PushNum     (buffer, m_msgRef.id);
46          PushString  (buffer, m_msgRef.user_name.c_str(), m_userLength);
47            PushString  (buffer, m_msgRef.content.c_str(), m_msgLength);
48          
49        }
50    private:
51        const Message&  m_msgRef;
52        const size_t    m_msgLength;
53        const size_t    m_userLength;
54    
55        template<typename INTEGER>
56        void PushNum(void*& buffer, INTEGER num) const
57        {
58            INTEGER* ptr = static_cast<INTEGER*>(buffer);
59            //copying content
60            *ptr = num;
61            //updating the buffer pointer to point the next position to copy
62            buffer = ++ptr;
63        }
64        void PushString(void*& buffer, const char* cstr, size_t length) const
65        {
66            PushNum(buffer, length);
67            //copying string content
68            memcpy(buffer, cstr, length);
69            //updating the buffer pointer to point the next position to copy
70            char* ptr = static_cast<char*>(buffer);
71            ptr += length;
72            buffer = ptr;
73        }
74    };

我们正在使用struct

struct Message {
    static unsigned int s_last_id; // keep track of IDs to assign it automatically
    unsigned int id;
    string user_name;
    string content;

    Message(const string& a_user_name, const string& a_content) :
        user_name(a_user_name), content(a_content), id(++s_last_id)
    {
    }
    Message(){} 
};
unsigned int Message::s_last_id = 0;

但是我们得到以下错误:

  • 第 31 行:错误 C4430:缺少类型说明符 - 假定为 int。注意:C++ 不支持 default-int

  • 第 31 行:错误 C2143:语法错误:在 '&' 之前缺少 ','

  • 第 35 行:错误 C4430:缺少类型说明符 - 假定为 int。注意:C++ 不支持 default-int

  • 第 35 行:错误 C2143:语法错误:缺少 ';'在'&'之前

  • 第 31 行:错误 C2065:'messageStruct':未声明的标识符

  • 第 33 行:错误 C2065:'m_msgRef':未声明的标识符

  • 第 33 行:错误 C2228:“.user_name”左侧必须有类/结构/联合

类型是''未知类型''

  • 第 33 行:错误 C2228:“.length”左侧必须有类/结构/联合

  • 第 34 行:错误 C2065:'m_msgRef':未声明的标识符

  • 第 34 行:错误 C2228:'.content' 左侧必须有类/结构/联合

类型是''未知类型''

  • 第 34 行:错误 C2228:“.length”左侧必须有类/结构/联合

  • 第 35 行:错误 C2758:“MessageSerializer::Message”:必须在构造函数基/成员初始化列表中初始化

  • 第 51 行:server2.cpp(51):参见“MessageSerializer::Message”的声明

  • 第 35 行:致命错误 C1903:无法从先前的错误中恢复;停止编译

你知道我的问题是什么吗?

【问题讨论】:

  • 也许你应该说错误出现在哪几行?
  • 你有没有#include 并使用命名空间std; ?
  • 非常感谢。我已经修改了代码,以便您可以看到行号以及错误所在的行。我们做了#include 并使用命名空间std,所以这不应该是问题,但还是谢谢你!
  • Message 是否包含或定义在 MessageSerializer 之前?
  • 消息定义后,是不是有问题?

标签: c++ visual-studio compiler-errors winsock2 serialization


【解决方案1】:

Message 是否包含或定义在 MessageSerializer 之前?

message被定义后,是不是有问题?

是的,这是个问题。将Message的定义移到MessageSerializer之前。

简单来说; C++ 编译器需要在使用之前查看类型的声明(针对指针和引用)或定义(针对值)。

来自cppreference的声明;

声明在 C++ 程序中引入(或重新引入)名称。

And 用于定义;

定义是完全定义由声明引入的实体的声明。每个声明都是一个定义,除了以下... [列表不适用和编辑]

【讨论】:

    猜你喜欢
    • 2014-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多