我有一个在头文件中声明和实现的 C++ 类。_GLIBCXX_DEBUG
我之所以选择这个,是因为由于预编译的库,人们无法在 Debug 和 Release 版本之间轻松移动。例如,如果我定义_GLIBCXX_DEBUG
,Boost 将由于源文件中的 ABI 更改而崩溃。
仅标头实现产生了重复符号的问题。例如,在下面的类中operator==
,非成员swap
将产生多重定义的符号。
// Foo.hpp
namespace Bar
{
template
class Foo
{
...
};
bool operator==(const Foo& a, const Foo& b) {
..
}
}
namespace std
{
template <>
void swap(Bar::Foo& a, Bar::Foo& b)
{
a.swap(b);
}
}
拆分声明和实现时,文件(Foo.hpp 和 Foo.cpp)编译并链接正常。
让它正确编译和链接的诀窍是什么?