stl类头中的多重定义
multiple definition in stl class header
我在使用这个类时遇到了麻烦,当我在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。我的错!
相关文章:
- STL 用户定义的二进制操作
- 自定义 STL 兼容迭代器,用于迭代 2D 数组类的列
- 如何使用 STL 排序对具有模板专用化的自定义类对象进行排序?
- 如何避免自定义 STL 向量类的智能指针 delete[] 异常?
- 如果我想从类型"T"定义元素的容器(来自 STL),那么"T"必须使用默认构造函数?
- C++ MSVC 中的自定义 STL 分配器错误?
- STL按客户"<"运算符对向量进行排序。为什么要将"<"运算符定义为 const?
- 在 stl 容器包装器中定义迭代器类型
- 通过函数指针对类内的 STL SET 使用自定义比较器
- 打印/修改类对象的特定成员变量,其类定义列表 (STL) 包含的元素类型
- 如何通过引用对用户定义对象的类型集 (STL) 的数组元素进行增强迭代?
- 重新定义要在字符串的 STL 算法中使用的<运算符
- C++ STL . 自定义比较器如何工作?
- 是否仍然可以自定义 STL 载体的"reference"类型?
- 如何定义 STL(C++) 的运算符重载
- 是否可以编写一个自定义 STL 分配器,该分配器使用指向用户提供的分配函数的指针
- 自定义 STL 分配器会导致删除第一个字符
- 自定义STL列表实现问题
- 公开自定义stl风格迭代的首选方式是什么?
- 自定义STL迭代器实现错误