stl类头中的多重定义

multiple definition in stl class header

本文关键字:定义 stl      更新时间:2023-10-16

我在使用这个类时遇到了麻烦,当我在main.cpp中使用时,没有问题,执行完美,但当我将它用作成员类时,编译器不喜欢它,并发送消息"Multiple definition of:"这是类别:

RTPSocket.h:

#ifndef RTP_SOCKET_HDR
#define RTP_SOCKET_HDR
    namespace RTPConnection
    {
    enum EMode
    {
        Sender,
        Receiver
    };
    template<EMode Mode>
    class RTPSocket
    {
    };
    }//end namespace

#define RTP_SOCKET_IMP
#include "RTPSocket_Imp.h"//file where i declare the implementation code
#undef RTP_SOCKET_IMP
#endif

这个类本身没有任何问题,但当我在类中使用它时,但是。。。。在其他类中使用我的文件.h

#include RTPSocket.h 
class CommClass
{
private:
RTPSocket<RTPConnection::Receiver>  * mRTPServer;
}

编译器给出以下错误消息:"enum RTPConnection::EMode"的多重定义

这是在另一个文件"rtpsocketimp.h"中声明的方法警卫宣布:

template<EMode Mode>
void RTPSocket<Mode>::write(char* aArray, 
                                      const size_t aiSize)
{
    std::string message("The write function is operative only on Sender Mode");
    throw BadTemplate(message);
}

您希望在标头周围包含警卫:

#ifndef RTPSOCKET_H
#define RTPSOCKET_H
// header contents go here
#endif

这将防止标头内容在每个源文件中包含多次,这样您就不会意外地获得多个定义。

更新:既然你说你已经包含了防护,那么错误的可能原因可能是:

  • 拼错了include保护名称,所以它不起作用
  • 在另一个标头(或包含该标头的源文件)中定义具有相同名称的内容
  • 取消包含防护名称的定义

但是,如果没有看到重现错误的代码,我只能猜测可能出了什么问题。

您需要一个include保护。在顶部的RTPSocket.h文件中放入

#ifndef RTPSOCKET_INCLUDED
#define RTPSOCKET_INCLUDED

最后放入

#endif

如果这不是问题所在,并且你确实有一个包含警卫,我建议你搜索

枚举EMode

在代码中,找到定义它的所有位置,并确保只定义一次。

我的问题是构建这个项目的CMakeLists.txt。我的错!