2016-04-15 49 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

相關問題