在window10安装vs2013编译,调试程序 给出解释并修正方案 下面是vs2013出现以下错误代码 warning C4251: “VTTestManagerBS::m_vtTestMap”: class“std::map<std::string,VTTestManagerBS::VTTestItem *,std::less<_Kty>,std::allocator<std::pair<const _Kty,_Ty>>>”需要有 dll 接口由 class“VTTestManagerBS”的客户端使用
1> with
1> [
1> _Kty=std::string
1> , _Ty=VTTestManagerBS::VTTestItem *
1> ]
1>d:\rxxq-project\server_src _2013\server\code\sourcecode\src\foundation\VTTest.h(122): warning C4251: “VTTestManagerBS::m_vtTestList”: class“std::vector<VTTestManagerBS::VTTestItem *,std::allocator<_Ty>>”需要有 dll 接口由 class“VTTestManagerBS”的客户端使用
1> with
1> [
1> _Ty=VTTestManagerBS::VTTestItem *
1> ]
1>d:\rxxq-project\server_src _2013\server\code\sourcecode\src\foundation\VTTest.h(124): warning C4251: “VTTestManagerBS::m_reportString”: class“std::basic_string<char,std::char_traits<char>,std::allocator<char>>”需要有 dll 接口由 class“VTTestManagerBS”的客户端使用
1>d:\rxxq-project\server_src _2013\server\code\sourcecode\src\foundation\VTTest.h(132): warning C4251: “VTTestManagerBS::m_reportPath”: class“std::basic_string<char,std::char_traits<char>,std::allocator<char>>”需要有 dll 接口由 class“VTTestManagerBS”的客户端使用
1>d:\rxxq-project\server_src _2013\server\code\sourcecode\src\foundation\VTTest.h(159): warning C4251: “VTTestOP::m_testName”: class“std::basic_string<char,std::char_traits<char>,std::allocator<char>>”需要有 dll 接口由 class“VTTestOP”的客户端使用
程序原代码:
#ifndef LOG_MGR_SINGLETON_H
#define LOG_MGR_SINGLETON_H 1
//资源管理类
#include "../Memory/FreeList.h"
#include "../TObjectPool.h"
#include <memory> // 添加智能指针支持
class LogManagerImpl; // 前置声明
class LogStream;
//!日志记录的条目信息结构体
struct _Foundation_Export_ LOG_ITEM
{
public:
////!操纵控制块 表的互斥变量
static Thread::RecMutex m_mutex;
_Def_Pool_Factory_(LOG_ITEM);
//!日志条目配置信息
enum ENLOGITEMCONFIG
{
//!最大日志长度
enMaxLogItemSize = 1024,
//!最大名字长度
enMaxLogNameSize = 32,
};
char m_typeName[enMaxLogNameSize+1];
char m_szDesc[enMaxLogItemSize+1];
unsigned int m_nNumber;
public:
//结构体赋值
int SetValue(const std::string& strType, const char* pszDesc, const unsigned int nNumber)
{
size_t cpySize = enMaxLogNameSize > strType.size() ? strType.size() : enMaxLogNameSize;
memcpy(m_typeName,strType.c_str(),cpySize);
m_typeName[cpySize] = 0;
m_nNumber = sizeof(m_szDesc);
if (m_nNumber > nNumber)
{
m_nNumber = nNumber;
}
memcpy(m_szDesc, pszDesc, m_nNumber);
return true;
};
LOG_ITEM& operator = (const LOG_ITEM& item)
{
memcpy(m_typeName,item.m_typeName,sizeof(m_typeName));
m_nNumber = sizeof(item.m_szDesc);
if (m_nNumber > item.m_nNumber)
{
m_nNumber = item.m_nNumber;
}
memcpy(m_szDesc, item.m_szDesc, m_nNumber);
return *this;
}
LOG_ITEM& operator = (const LOG_ITEM* pItem)
{
memcpy(m_typeName,pItem->m_typeName,sizeof(m_typeName));
m_nNumber = pItem->m_nNumber;
memcpy(m_szDesc, pItem->m_szDesc, m_nNumber);
return *this;
}
void Reset(void)
{
}
};
/**
* @brief Log性能参数记录
*/
class _Foundation_Export_ LogPerfData
{
public:
LogPerfData(void)
:m_logTotalCount(0)
{
}
//!总共记录的条目数量
unsigned int m_logTotalCount;
protected:
private:
};
/**
*日志记录,单件模式
*/
class _Foundation_Export_ LogMgrSingleton
{
_Singleton_Decl(LogMgrSingleton);
public:
// Constructor
LogMgrSingleton();
// Destructor
virtual ~LogMgrSingleton();
//!性能参数记录
LogPerfData m_perf;
//日志有关操作
public:
//!注册一个日志类型
bool RegisterLog(std::string strType);
//!获得LogItem,以便于外部直接改写Item中的数据,避免一次拷贝
LOG_ITEM* GetLogItem(void);
//!直接报告LogItem
int Report(LOG_ITEM* item);
//!日志输出,放入列表
int Report(const std::string& strType, const char* pszDesc, const int lNumber);
//!日志输出,
int ReportEx(const std::string& strType, char* pszDesc, int lNumber);
//!线程调用的函数
static void WriteLog(void* ptr);
//!具体的处理Log的函数
void WriteLogEx();
//!依据注册名,查找log流
LogStream* LookupStreamByName(const std::string& name);
//输出流有关操作
public:
//!压入一个stream,以后创建流就用这个创建
void PushStream(LogStream* stream);
//!获得一个预先压入的stream
LogStream* CreateStream(const std::string& n);
//!弹出一个stream
LogStream* PopStream(void);
//创建文件有关操作
private:
//!创建logs文件夹
int CreateLogsDirectory(void* pContext);
//!创建当前日期文件夹
int CreateDateDirectory(void* pContext);
//!获得当前日期
int GetCurrentDate(char* pszReturn, const int nLength);
//!文件是否存在
int IsFileExist(std::string& strPath);
private:
//!从日志队列m_queLogList中获得第一个Log.
LOG_ITEM* GetFrontLogData(void);
private:
//存放日志文件的句柄
std::map<std::string, FILE*> m_vecLogFileHandle;
std::map<std::string, LogStream*> m_vecLogStream;
//std::unique_ptr<LogManagerImpl> pImpl; // Pimpl惯用法
//File Handle
FILE* m_hFile;
//logs文件夹
std::string m_strLogsPath;
std::stack<LogStream*> _streamStack;
AG_Time m_AG_Time;
private:
Thread::BaseThread* m_LogThread;
////!操纵控制块 表的互斥变量
Thread::RecMutex m_mutex;
//!开始log的信号量
Thread::Semaphore m_sem;
private:
//!日志结构体
LOG_ITEM m_LogItem;
//!存放所有日志的线性链表(目前使用queue代替)
std::queue<LOG_ITEM*> m_queLogList;
//!下面创建的内存对象,最好能放到
private:
//!创建玩家对象
LOG_ITEM* CreateLogItem(void);
//!删除玩家对象
void FreeLogItem(LOG_ITEM* pLogItem);
private:
//预存放日志的内存分配
gems::FreeList< LOG_ITEM,
gems::CompactableChunkPolicy<LOG_ITEM>,
gems::ConstantChunkSizeGrowthPolicy<LOG_ITEM, 1024> > m_logMemoryList;
};
//!
#define LOG_REPORT_PUSHSTREAM(ptr) LogMgrSingleton::Instance()->PushStream(ptr)
#define LOG_REPORT_POPSTREAM() LogMgrSingleton::Instance()->PopStream()
//!
#define LOG_REPORT_REGISTER(path) LogMgrSingleton::Instance()->RegisterLog(path)
#define LOG_REPORT_EX(path, desc, num) LogMgrSingleton::Instance()->Report(path, desc, num)
#define LOG_REPORT_LOOKUP(name) LogMgrSingleton::Instance()->LookupStreamByName(name)
extern "C"
{
void _Foundation_Export_ _LOG_REPORT_OUTPUT_(const char* pszType,const char* pszString,...);
#define LOG_REPORT_OUTPUT
void _Foundation_Export_ _Server_LOG_File_(const char* pszType,const char* pszString,...);
void _Foundation_Export_ debugOutputString(const char* pszString,...);
//void _Foundation_Export_ LOG_REPORT_OUTPUT2( );
}
#endif
最新发布