我正在build立一个库,它处理几种不同types的二进制“语言”,每种语言都有一个“处理器”types。 该库build立良好,我到目前为止的范围缩小到以下模板代码:
// 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>;
当我尝试构build一个与我的库链接的应用程序时,在通过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中构build显式实例时并不完全一样。 我已经尝试明确地在库中实例化通过:
template class Processor<CustomType4, DefaultProcessor>; template class Processor<CustomType5, DefaultProcessor>;
这只会导致库由于重复的显式实例而无法生成。
什么会导致这个问题完全出现在Linux版本?
谢谢。
你的模板没有定义一个接受DefaultProcessor *
作为参数的构造函数,所以显然是未定义的。
您的显式实例必须存在于定义默认构造函数和operator->
的实现的相同文件中。 否则,这些方法将不会被实例化。
我通过在定义模板的文件顶部定义一些虚拟类来测试您的代码。
struct DefaultProcessor { virtual ~DefaultProcessor() {} }; struct CustomType2 : DefaultProcessor {}; struct CustomType1 : CustomType2 {}; struct CustomType3 : DefaultProcessor {}; struct CustomType4 : DefaultProcessor {}; struct CustomType5 : DefaultProcessor {}; struct CustomType6 : DefaultProcessor {};
在具有模板方法定义的C ++文件底部,我添加了显式定义。 然后我编译这样的代码:
g++ -fPIC -std=c++0x -c t.cc g++ -shared -o t.so to
为了观察实例是否卡住,我使用了nm
和c++filt
。 这里是包含CustomType1
的符号:
0000000000002a06 W Processor<CustomType1, CustomType2>::Processor(CustomType2*) 0000000000002a06 W Processor<CustomType1, CustomType2>::Processor(CustomType2*) 0000000000002a9c W Processor<CustomType1, CustomType2>::~Processor() 0000000000002a66 W Processor<CustomType1, CustomType2>::~Processor() 0000000000002a66 W Processor<CustomType1, CustomType2>::~Processor() 00000000000026dc W Processor<CustomType1, DefaultProcessor>::Processor(DefaultProcessor*) 00000000000026dc W Processor<CustomType1, DefaultProcessor>::Processor(DefaultProcessor*) 0000000000002772 W Processor<CustomType1, DefaultProcessor>::~Processor() 000000000000273c W Processor<CustomType1, DefaultProcessor>::~Processor() 000000000000273c W Processor<CustomType1, DefaultProcessor>::~Processor() 0000000000002ac2 W Processor<CustomType1, CustomType2>::operator->() const 0000000000002798 W Processor<CustomType1, DefaultProcessor>::operator->() const