我正在開發一個庫,在我的工作中,我設計了一個複雜的繼承,其中包含模板類並從中派生。 我的問題是,基本模板類具有虛擬重載運算符,它接受2個參數並返回一些值。在基類中實現了這個運算符,大多數派生類不重新實現這個運算符。在從模板類派生的類中訪問基類成員函數
某些其他類使用派生類進行某些工作並利用其運算符成員函數。只要派生類沒有其他重載操作符,即使使用不同的參數數量,一切正常。如果有的話,那麼基類操作符就不能使用它作爲object()
,因爲編譯器找不到正確的成員函數(抱怨參數計數不匹配)。
指定或不指定基類的默認模板參數。此外,派生類的定義順序不會更改哪個運算符導致問題(它始終是SpecificDerived
類)。
下面我提出簡化的問題。
[編輯]實施例進行了簡化
基礎類定義:
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;
}
};
01派生類定義的
template<class ret_t>
class TemplateBase2
{
public:
virtual ~TemplateBase2()
{
}
virtual ret_t memberFunc(ret_t x)
{
return x * 2;
}
};
用戶
主要功能:
#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
功能。只有派生類或基類具有兩個具有相同名稱但具有不同參數的重載函數時才存在問題。
我正在使用MinGW32 4.8.1和C++ 11支持。
然而,在我的例子一切工作得很好,只要有在派生或基類中沒有其他重載函數,但是從你說過,看起來即使這樣也不行。 – Krzych
@KrzysztofPilch:你可以做一個*小*的例子來說明情況嗎? –
我編輯過的例子比較簡單。 – Krzych