我預計這個工作:重寫在派生類中某些重載而不是其他
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 –