0

我在使用这个类时卡住了,当我在 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);
}
4

3 回答 3

4

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

#ifndef RTPSOCKET_H
#define RTPSOCKET_H

// header contents go here

#endif

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

更新:既然你说你有包括警卫,那么错误的可能原因可能是:

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

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

于 2013-07-15T15:13:08.070 回答
3

你需要一个包含警卫。在顶部放置的 RTPSocket.h 文件中

#ifndef RTPSOCKET_INCLUDED
#define RTPSOCKET_INCLUDED

最后放

#endif

如果这不是问题,并且您确实有一个包含防护,我建议您搜索

枚举 EMode

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

于 2013-07-15T15:13:47.247 回答
0

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

于 2013-07-19T21:06:33.520 回答