gpt4 book ai didi

c++ - C++ 模板中的链接错误

转载 作者:太空狗 更新时间:2023-10-29 21:05:18 26 4
gpt4 key购买 nike

我需要生成一个需要链接到 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;
}

主要是我实例化了对象并使用它:

#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)中,您已经多次定义了该函数。 (参见 One Definition Rule 。)

要么声明函数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)
, 不是一个函数——它是一个函数模板——不同的建议适用于它。根据经验,您 应该在头文件中定义函数模板,但 不应该在头文件中定义函数。 (这条经验法则也有异常(exception)。)

关于c++ - C++ 模板中的链接错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10301136/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com