2016-04-15 50 views
2

我正在构建一个库,用于处理几种不同类型的二进制“语言”,其中每种语言都有一个“处理器”类型。该库建立罚款,到目前为止,我已经缩小的问题,下面的模板代码: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版本中?

谢谢。

+1

''Processor()'末尾的分号是不必要的,你需要在'Processor'类的末尾加一个分号。 –

+1

你正在导出实例吗? –

+0

它是平台特定的,但我知道在过去,当我完成这些时,他们都在源文件的底部,并使用与用于导出普通类相同的导出宏。 –

回答

1

您的模板未定义接受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 t.o 

观察,如果实例卡住了,我用nmc++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 
+0

我已经添加了建议的构造函数。奇怪它在第一个地方建立。这些文件在相同的文件中,定义了相关的实现。 – DevNull

+0

我在头文件中添加了更改。是的,实例化位于'.cpp'文件的底部。 – DevNull

+0

这帮助我追踪了这个问题。另外,我没有正确导出符号。谢谢! – DevNull

相关问题