求助~无法解析的外部命令
///////////////////////////////////////////////////////////
// log.h
///////////////////////////////////////////////////////////
#ifndef __LOG_H__
#define __LOG_H__
#include <string>
#include <fstream>
class CTextDecorator
{
public:
static std::string FileHeader( const std::string & title );
static std::string SessionOpen();
static std::string SessionClose();
static std::string Decorate( const std::string & str );
};
template <class decorator>
class CLogger
{
public:
CLogger(const std::string & filename,
const std::string & logtitle,
bool timestamp = false,
bool datestamp = false );
~CLogger();
void Write( const std::string & entry);
protected:
std::fstreamm_logfile;
boolm_timestamp;
boolm_datestamp;
};
#endif
///////////////////////////////////////////////////////////
// log.cpp
///////////////////////////////////////////////////////////
#include "log.h "
std::string CTextDecorator::FileHeader( const std::string & title )
{
return "=====================================================\n " +
title + "\n " +
"=====================================================\n\n ";
}
std::string CTextDecorator::SessionOpen()
{
return "\n ";
}
std::string CTextDecorator::SessionClose()
{
return "\n ";
}
std::string CTextDecorator::Decorate( const std::string & str )
{
return str + "\n ";
}
template <class decorator>
CLogger <decorator> ::CLogger(const std::string & filename,
const std::string & logtitle,
bool timestamp = false,
bool datestamp = false )
{
fstream filetester ( filename.c_str(), std::ios::in );
if( filetester.is_open() )
{
filetester.close();
m_logfile.open( filename.c_str(), std::ios::out | std::ios::app );
}
else
{
m_logfile.open( filename.c_str(), std::ios::out );
m_logfile < < decorator::FileHeader( logtitle );
}
m_timestamp = true;
m_datestamp = true;
m_logfile < < decorator::SessionOpen();
Write( "Session opened. " );
m_timestamp = timestamp;
m_datestamp = datestamp;
}
template <class decorator>
CLogger <decorator> ::~CLogger()
{
m_timestamp = true;
m_datestamp = true;
Write( "Session closed. " );
m_logfile < < decorator::SessionClose();
}
template <class decorator>
void CLogger <decorator> ::Write( const std::string & entry)
{
std::string message;
if( m_datestamp )
{
message += "[ " + DateStamp() + "] ";
}
if( m_timestamp )
{
message += "[ " + TimeStamp() + "] ";
}
message += entry;
m_logfile < < decorator::Decorate( message );
}
///////////////////////////////////////////////////////////
// test.cpp
///////////////////////////////////////////////////////////
#include "log.h "
typedef CLogger <CTextDecorator> TextLog;
int main()
{
TextLog syslog( "system.log ", "system ");
syslog.Write( "sdsadsadasd ");
syslog.Write( "12343543543 ");
syslog.Write( "sdsadsadasd ");
syslog.Write( "12343543543 ");
return 0;
}
///////////////////////////////////////////////////////////////
最后链接有错误:
test.obj : error LNK2019: 无法解析的外部符号 "public: __thiscall CLogger::~CLogger(void) " (??1?$CLogger@VCTextDecorator@@@@QAE@XZ) ,该符号在函数 _main 中被引用
test.obj : error LNK2019: 无法解析的外部符号 "public: void __thiscall CLogger::Write(class std::basic_string,class std::allocator > const &) " (?Write@?$CLogger@VCTextDecorator@@@@QAEXABV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@Z) ,该符号在函数 _main 中被引用
test.obj : error LNK2019: 无法解析的外部符号 "public: __thiscall CLogger::CLogger(class std::basic_string,class std::allocator > const &,class std::basic_string,class std::allocator > const &,bool,bool) " (??0?$CLogger@VCTextDecorator@@@@QAE@ABV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@0_N1@Z) ,该符号在函数 _main 中被引用
Debug/Log.exe : fatal error LNK1120: 3 个无法解析的外部命令
这是为什么啊?
[解决办法]
模板类不支持h和cpp分开写,全部整到一个h里吧
[解决办法]
楼上的错了,标准就是应该声明实现分离
可能你用的编译器不支持吧
[解决办法]
模板定义和实现都放在头文件吧!!!
除非你的编译器支持export关键字:)
[解决办法]
模板定义和实现都放在头文件吧!!!