读书人

~无法解析的外部命令

发布时间: 2012-02-22 19:36:55 作者: rapoo

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

读书人网 >C++

热点推荐