我正在构建一个库来处理几种不同类型的二进制“语言”,每种语言都有一个“处理器”类型。该库构建良好,到目前为止,我已将问题范围缩小到以下模板代码:
// Processor.h
template <class A, class B = DefaultProcessor>
class Processor
{
public:
// Default constructor.
Processor(void);
// Constructor from DefaultProcessor pointer type.
Processor(B* pB);
virtual ~Processor(void){};
// Dereferencing operator
A* operator->(void) const;
private:
A* pRawPointer;
};
// Processor.cpp
template <class A, class B>
A* Processer<A, B>::operator->(void) const
{
if (nullptr == pRawPointer)
{
throw();
}
return pRawPointer;
}
// Constructor from DefaultProcessor pointer type.
template <class A, class B>
Processor<A, B>::Processor(B* pB)
: pRawPointer(dynamic_cast<A*>(pB))
{
}
我有它支持的几十个不同的类,在我的库中,我有一长串显式实例化:
template class Processor<CustomType1>;
template class Processor<CustomType2>;
template class Processor<CustomType3>;
template class Processor<CustomType1, CustomType2>;
template class Processor<CustomType4>;
template class Processor<CustomType5>;
template class Processor<CustomType6>;
当我尝试构建一个链接到我的库的应用程序时,在通过 编译时遇到以下错误g++ -Wall -std=c++11
,但在 Visual Studio 2015 中构建时没有任何问题:
undefined reference to `Processor<CustomType4, DefaultProcessor>::Processor(DefaultProcessor*)'
undefined reference to `Processor<CustomType4, DefaultProcessor>::operator->() const'
undefined reference to `Processor<CustomType5, DefaultProcessor>::Processor(DefaultProcessor*)'
undefined reference to `Processor<CustomType5, DefaultProcessor>::operator->() const'
就好像在 Linux 中构建时没有完全生成显式实例化一样。我尝试通过以下方式在库中显式实例化:
template class Processor<CustomType4, DefaultProcessor>;
template class Processor<CustomType5, DefaultProcessor>;
由于重复的显式实例化,这只会导致库无法构建。
什么会导致此问题仅在 Linux 版本中出现?
谢谢你。