我正在构建一个库,用于处理几种不同类型的二进制“语言”,其中每种语言都有一个“处理器”类型。该库建立罚款,到目前为止,我已经缩小的问题,下面的模板代码:G ++中没有生成某些显式实例
// 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版本中?
谢谢。
''Processor()'末尾的分号是不必要的,你需要在'Processor'类的末尾加一个分号。 –
你正在导出实例吗? –
它是平台特定的,但我知道在过去,当我完成这些时,他们都在源文件的底部,并使用与用于导出普通类相同的导出宏。 –