我预计这个工作:重写在派生类中某些重载而不是其他
template <typename T> class MyBaseClass
{
public:
MyBaseClass();
virtual ~MyBaseClass();
void DoSomething(const T& myClass);
// Implemented in .cpp file
virtual void DoSomething(int n, const T& myClass);
// Implemented in .cpp file
};
class MyDerivedClass : public MyBaseClass<int>
{
public:
virtual void DoSomething(int n, const int& myInt);
// Implemented in .cpp file
};
...在我的代码的其他地方:
int i;
MyDerivedClass myClass;
myClass.DoSomething(i);
但是,它不支持;相反,它失败,出现错误,说来编译(在Visual C++的情况下)
error C2660: 'int::DoSomething' : function does not take 1 arguments
...即使有明显是 DoSomething的一个版本,在基类中声明,该确实只需要一个参数。该错误消失,如果我注释掉的DoSomething的重新定义与派生类参数。
什么微妙的C++规则有我的地方自然落下犯规,而且是有解决这个优雅的方式?
对不起,我错了我的第一个评论。 –
请编辑您的代码,'myBaseClass'需要资金首字母和'诠释MyDerivedClass'必须'类MyDerivedClass' – TemplateRex
我的猜测是它的功能查找的一些复杂性。该函数在派生中找到,而不是进一步查看;只有重载解析被尝试(派生内)失败(派生不声明该签名)。参看http://en.cppreference.com/w/cpp/language/overload_resolution –