我正在構建一個庫,用於處理幾種不同類型的二進制「語言」,其中每種語言都有一個「處理器」類型。該庫建立罰款,到目前爲止,我已經縮小的問題,下面的模板代碼: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'類的末尾加一個分號。 –
你正在導出實例嗎? –
它是平臺特定的,但我知道在過去,當我完成這些時,他們都在源文件的底部,並使用與用於導出普通類相同的導出宏。 –