stl类头中的多重定义

时间:2013-07-15 15:09:54

标签: c++ stl linker

我在使用这个类时遇到困难,当我在main.cpp中使用时没有问题并且执行完美,但是当我将它用作成员类时,编译器不喜欢它并发送消息“多个定义的:” 这是班级:

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

这个类本身没有任何问题,但是当我在课堂上使用它时,... 用在另一个班级 我的file.h

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

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

这是在另一个文件“rtpsocket_imp.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);
}

3 个答案:

答案 0 :(得分:4)

你想要在标题周围包含警戒:

#ifndef RTPSOCKET_H
#define RTPSOCKET_H

// header contents go here

#endif

这样可以防止每个源文件多次包含标题内容,因此您不会意外地获得多个定义。

更新:由于您说您有包含警戒,因此错误的可能原因可能是:

  • 拼错包含警卫名称,因此无效
  • 在另一个标题(或包含它的源文件)中定义具有相同名称的内容
  • 取消定义包含警卫名称。

但是如果没有看到重现错误的代码,我只能猜出可能出错的地方。

答案 1 :(得分:3)

您需要include guard。 在顶部的RTPSocket.h文件中放入

#ifndef RTPSOCKET_INCLUDED
#define RTPSOCKET_INCLUDED

最后放

#endif

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

  

枚举EMode

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

答案 2 :(得分:0)

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