私は自分の仕事でライブラリを開発しており、テンプレート クラスを含む複雑な継承を設計し、それらから派生しています。私の問題は、基本テンプレート クラスに、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 を使用しています。