首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

~无法解析的外部命令

2012-02-22 
求助~无法解析的外部命令/////////////////////////////////////////////////////////////log.h//////////

求助~无法解析的外部命令
///////////////////////////////////////////////////////////
//     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关键字:)
[解决办法]
模板定义和实现都放在头文件吧!!!

热点排行