我在使用这个类时遇到困难,当我在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);
}
答案 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。 我的错!