簡體   English   中英

鏈接C ++模板中的錯誤

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM