c++ - 错误 C2011 : 'member' : 'struct' type redefinition on moving a struct to a new header file

标签 c++ boost

我有一个包含一些类代码的 .h 文件 - overlay.h

    #include<iostream>
    #include<boost/thread.hpp> 
    #include<vector>
    #include<boost/asio.hpp> 
    #include <string>
    #include <boost/serialization/vector.hpp>
    #include <boost/archive/text_oarchive.hpp> 
    #include <boost/archive/text_iarchive.hpp> 
    #include <sstream> 
    #include <boost/tuple/tuple.hpp>
    #include<member.h>
    using boost::asio::ip::tcp;

    class overlay_server{...};

struct member{
    std::string ip_address;
    short int port;

    template<class Archive>
    void serialize(Archive & ar, const unsigned int version)
    {
        ar & ip_address;
        ar & port;
    }
};

现在我将结构移动到另一个名为 member.h 的新文件 并包含此文件,以便我的类 overlay_server 可以使用它。 现在,当我构建程序时出现错误。

我应该做哪些更改才能使这项工作正常进行? 我在 SO 上阅读了有关 header guards 的信息,但无法真正理解如何在此处实现它来解决问题。

----编辑----

成员.h

struct member{
    std::string ip_address;
    short int port;

    template<class Archive>
    void serialize(Archive & ar, const unsigned int version)
    {
        ar & ip_address;
        ar & port;
    }
};

运行.cpp

    #include<overlay_server.h>
#include<overlay_client.h>

int main(){

    overlay_server overlay_server_(8002);
    boost::thread thread_(boost::bind(&overlay_server::member_list_server, overlay_server_));


    overlay_client overlay_client_("127.0.0.1",8002);
    overlay_client_.member_list_client();

    thread_.join();
}

我没有在任何地方重新定义结构。 我有另一个名为 overlay_client 的类,它也使用结构成员。

在我的主要功能中,我创建了 overlay_server 和 overlay_client 的对象。 现在我的程序只有在 overlay_server.h 中包含 member.h 时才会运行(尽管 overlay_server 和 overly_client 中的代码都需要它) 如果它包含在两者中,那么我会得到重新定义错误

为什么?

----编辑----

我的 member.h 中的这段代码解决了这个问题 Compile error "'struct' type redefinition" although it's the first definition for it

最佳答案

您也可以使用 pragma 并获得相同的效果。在所有头文件的顶部,写:

#pragma once

rest of the header
 .
 .
 .

而include guards的使用方法是将一个头文件中的所有内容都用include guard包围起来,如下所示:

// At the very top
#if !defined(SOME_SYMBOL)
#define SOME_SYMBOL

rest of the header
 .
 .
 .

// At the very bottom
#endif  // SOME_SYMBOL

现在,选择一个合理的名称而不是 SOME_SYMBOL非常重要。大多数程序员根据文件名(以及路径和项目名称以及公司/个人名称)创建保护名称。例如,对于位于“[项目根目录”中的名为“some_header.h”(或“SomeHeader.h”)的 header ]/include/myproject",您可以将守卫名称命名为 __INCLUDE__MY_PROJECT__SOME_HEADER_H__。但这只是一个建议;任何独特的符号都可以。

您还可以结合使用 pragma 和 include guard(因为 pragma 方法可以在非常大的项目中 boost 编译时间,但是不是所有的编译器都支持它。)如果你想要它们,你会写:

#pragma once

#if !defined(__INCLUDE__MY_PROJECT__SOME_HEADER_H__)
#define __INCLUDE__MY_PROJECT__SOME_HEADER_H__

rest of the header
 .
 .
 .

#endif  // __INCLUDE__MY_PROJECT__SOME_HEADER_H__

这没有负面影响(据我所知),只是有可能防止构建错误并使您的构建更快(在大型项目上)。但是请注意包含守卫和 #pragma once 完全相同。在极少数情况下,您可能需要使用其中之一,或者两者都不用。

关于c++ - 错误 C2011 : 'member' : 'struct' type redefinition on moving a struct to a new header file,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16727462/

相关文章:

c++ - CMake 使用错误的链接器标志(动态与静态)

c++ - 使用多线程优化执行时间(简单示例)

C++多线程目录扫描代码

c++ - 如何从 boost::interprocess::managed_shared_memory 对象获取 shmid

c++ - 警告C6236:(||)始终为非零常量

c++ - 修改cout以延迟屏幕输出?

c++ - 如何使用 boost::msm 的前向声明来避免循环依赖?

c++ - 从 std::vector 中删除复制结构成员

c++ - 如何使用 std::copy 将一张 map 复制到另一张 map 中?

c++ - 返回 std::array 未知大小