【发布时间】:2012-11-07 00:01:50
【问题描述】:
我有一个在头文件中声明和实现的 C++ 类。我之所以选择这个,是因为由于_GLIBCXX_DEBUG 和预编译的库,人们无法在调试和发布版本之间轻松移动。比如我定义_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)编译和链接OK。
有什么诀窍可以让它正确编译和链接?
【问题讨论】:
-
我的猜测是头文件必须是内联函数
标签: c++ compiler-construction build symbols