2

言語ごとに「プロセッサ」タイプを持つ、いくつかの異なるタイプのバイナリ「言語」を処理するライブラリを構築しています。ライブラリは正常にビルドされます。これまでのところ、問題を次のテンプレート コードに絞り込みました。


// 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>;

ライブラリにリンクするアプリケーションをビルドしようとすると、.NET 経由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 ビルドでのみ発生する原因は何ですか?

ありがとうございました。

4

1 に答える 1