我正在开发一个库,在我的工作中,我设计了一个复杂的继承,其中包含模板类并从中派生。 我的问题是,基本模板类具有虚拟重载运算符,它接受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