[英]Linking error in C++ Template
我需要生成一個簡單的Logger(帶有第三方庫),需要鏈接到dll。 因此我生成了一個類,其中一些類方法是模板,代碼編譯正常,但我得到鏈接器錯誤。 我正在使用MS VS 2008和gcc-4進行編譯。 代碼是:
Log.h類:
class MiniLogger
{
private:
std::ofstream mOutPutFile;
protected:
void write (std::string const& text);
public:
~MiniLogger();
MiniLogger( std::string const& lName) throw(FileError);
static MiniLogger* getInstance(std::string const & fName);
static void destoryInstance(MiniLogger*);
template<class T>
MiniLogger& operator<<(T & data);
MiniLogger& operator<<(std::ostream& (*func)(std::ostream&) );
};
MiniLogger& MiniLogger::operator<< (std::ostream& (*func)(std::ostream&))
{
//mOutPutFile << out;
return *this;
}
template<class T>
MiniLogger& MiniLogger::operator<< (T & data)
{
//Just try with out calling other method
// write(data);
return *this;
}
在main我實例化了Object並使用它:
#include "log.h"
int main()
{
MiniLogger &a=*(MiniLogger::getInstance("text.txt"));
a << "text" << std::endl;
return 0;
}
我明白了
@ubu11-10-64b-01:~/cplus/template$ g++ main.cpp log.cpp
/tmp/cccMdSBI.o: In function `MiniLogger::operator<<(std::basic_ostream<char, std::char_traits<char> >& (*)(std::basic_ostream<char, std::char_traits<char> >&))':
log.cpp:(.text+0x0): multiple definition of `MiniLogger::operator<<(std::basic_ostream<char, std::char_traits<char> >& (*)(std::basic_ostream<char, std::char_traits<char> >&))'
/tmp/ccj3dfhR.o:main.cpp:(.text+0x0): first defined here
您已在頭文件中定義了一個函數。 由於該頭文件包含在多個轉換單元中(即main.cpp和log.cpp),因此您已經多次定義了該函數。 (參見一個定義規則 。)
聲明函數inline
並在頭文件中定義它,或在頭文件中聲明它extern
並在一個源文件中定義。
有問題的函數是: MiniLogger& MiniLogger::operator<< (std::ostream& (*func)(std::ostream&))
。
解決方案#1:
// Log.h
inline
MiniLogger& MiniLogger::operator<< (std::ostream& (*func)(std::ostream&))
{
//mOutPutFile << out;
return *this;
}
解決方案#2:
// Log.h
extern
MiniLogger& MiniLogger::operator<< (std::ostream& (*func)(std::ostream&));
// Log.cpp
MiniLogger& MiniLogger::operator<< (std::ostream& (*func)(std::ostream&))
{
//mOutPutFile << out;
return *this;
}
template<class T> MiniLogger& MiniLogger::operator<< (T & data)
,不是函數 - 它是一個函數模板 - 並且不同的建議適用於它。
根據經驗,您應該在頭文件中定義函數模板,但不應在頭文件中定義函數。
(這個經驗法則有例外。)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.