I have the following code in a header only file.
#pragma once
class error_code {
public:
unsigned __int64 hi;
unsigned __int64 lo;
};
std::ostream& operator<< (std::ostream& o, const error_code& e) {
return o << "[" << e.hi << "," << e.lo << "]";
}
I get linkage error, when there are 2 cpp in the project include this header file.
error LNK2005: "class error_code __cdecl operator|(class error_code const &,class ViTrox::error_code const &)" (??U@@YA?AVerror_code@0@ABV10@0@Z) already defined in xxx.obj
I know I can resolve this problem, if I move the definition of operator<<
to a cpp file, or to a DLL file.
However, I just would like to have them in a SINGLE header file. Is there any technique to achieve so? Or must I separate the definition to another file?
Use the inline
keyword.
inline std::ostream& operator<< (std::ostream& o, const error_code& e) {
return o << "[" << e.hi << "," << e.lo << "]";
}
Either make the function inline
:
inline std::ostream& operator<< (std::ostream& o, const error_code& e) {
return o << "[" << e.hi << "," << e.lo << "]";
}
or make it a template function:
template<class Ch, class Tr>
std::basic_ostream<Ch,Tr>& operator<< (std::basic_ostream<Ch,Tr>& o,
const error_code& e) {
return o << "[" << e.hi << "," << e.lo << "]";
}
You can make the function static
. It specifies internal linkage, so the linker won't care if the function is already defined in other translation units.
Or, as already mentioned, you can make it inline
. It still has external linkage, but the standard allows external inline functions to have a definition in multiple translation units.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With