4

私は自分の仕事でライブラリを開発しており、テンプレート クラスを含む複雑な継承を設計し、それらから派生しています。私の問題は、基本テンプレート クラスに、2 つの引数を取り、何らかの値を返す仮想オーバーロード演算子があることです。基本クラスではこの演算子が実装されており、ほとんどの派生クラスはこの演算子を再実装していません。

他の一部のクラスは、一部の作業に派生クラスを使用し、演算子メンバー関数を利用します。派生クラスに他のオーバーロードされた演算子がない限り、引数の数が異なっていても、すべてが正常に機能します。object()その場合、コンパイラが適切なメンバー関数を見つけることができないため(引数カウントの不一致について不平を言う)、基本クラス演算子はそれを使用してアクセスできません。

基本クラスのデフォルトのテンプレート引数が指定されているかどうかは関係ありません。また、派生クラスの定義の順序は、どの演算子が問題を引き起こすかを変更しません (常にSpecificDerivedクラスです)。

以下に、単純化された問題を示します。

[編集] 例は単純化されました

基本クラスの定義:

template<class ret_t>
class TemplateBase2
{
public:
    virtual ~TemplateBase2()
    {
    }

    virtual ret_t memberFunc(ret_t x)
    {
        return x * 2;
    }
};

派生クラス定義のユーザー:

template <class worker, class ret_t>
ret_t gobble(worker w, float f)
{
    return w.memberFunc((ret_t)f);
}

派生クラス:

class SpecificDerived2: public TemplateBase2<float>
{
public:
    float memberFunc()
    {
        return 3.14;
    }
};

主な機能:

#include <iostream>
#include "TemplateBase2.h"

using namespace std;

int main()
{
    SpecificDerived2 sd2;

    cout << "sd2: " << gobble<SpecificDerived2, float>(sd2, 3.14f) << endl; 
    return 0;
}

no matching function for call to 'SpecificDerived2::memberFunc(float)'関数からあると主張するエラーでコンパイラが終了しますgobble。問題は、派生クラスまたは基本クラスのいずれかに、同じ名前で引数が異なる 2 つのオーバーロードされた関数がある場合にのみ発生します。

c++11 をサポートする MinGW32 4.8.1 を使用しています。

4

1 に答える 1