我正在开发一个库,我设计了一个复杂的继承,其中包括模板类并从它们派生。我的问题是一个基模板类具有虚拟重载运算符,它接受 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
函数的错误。仅当派生类或基类具有两个同名但参数不同的重载函数时,才会出现问题。
我正在使用支持 c++11 的 MinGW32 4.8.1。