我正在开发一份工作文库,其中包括模板类和从中派生出的复杂继承关系。
我的问题在于,一个基础模板类拥有虚拟重载运算符,它带有两个参数并返回某个值。在基类中实现了这个运算符,在大多数派生类中都没有重新实现该运算符。
一些其他类使用派生类进行一些工作,并利用它们的运算符成员函数。只要派生类没有其他重载的运算符(即使参数个数不同),所有的事情都很顺利。但是如果有一个派生类有其他重载的运算符,则无法像
无论是否指定了基类的默认模板参数,都没有关系。此外,定义派生类的顺序也不会改变造成问题的运算符(它始终是
下面我给出简化后的问题。
[编辑]示例已经简化
基类定义:
编译器报错,声称从“gobble”函数中不存在与“SpecificDerived2 :: memberFunc(float)”相匹配的函数。 只有当派生类或基类具有相同名称但不同参数的两个重载函数时才存在问题。
我正在使用支持c ++ 11的MinGW32 4.8.1。
一些其他类使用派生类进行一些工作,并利用它们的运算符成员函数。只要派生类没有其他重载的运算符(即使参数个数不同),所有的事情都很顺利。但是如果有一个派生类有其他重载的运算符,则无法像
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;
}
编译器报错,声称从“gobble”函数中不存在与“SpecificDerived2 :: memberFunc(float)”相匹配的函数。 只有当派生类或基类具有相同名称但不同参数的两个重载函数时才存在问题。
我正在使用支持c ++ 11的MinGW32 4.8.1。
using
子句的情况下访问。 - Krzych