Я пытаюсь создать класс в C ++, который реализует несколько интерфейсов с одинаковыми именами методов, но с разными сигнатурами.
#include <string>
#include <iostream>
using namespace std;
class IA {
public:
virtual void method(int i) = 0; // Signature is different from IB::method
virtual ~IA() { }
};
class IB {
public:
virtual void method(const string& s) = 0; // Signature is different from IA::method
virtual ~IB() { }
};
class MyClass : public IA, public IB {
virtual void IA::method(int i) {
cout << "IA::method " << i << endl;
}
virtual void IB::method(const string& s) {
cout << "IB::method " << s << endl;
}
virtual ~MyClass() { }
};
Этот класс компилируется с использованием Visual C ++ 2017. Однако я хотел бы отделить реализации метода от заголовка класса, но перемещение реализации за пределы объявления класса вызывает ошибки компиляции.
Например, это не работает:
class MyClass : public IA, public IB {
virtual void IA::method(int i);
virtual void IB::method(const string& s);
virtual ~MyClass() { }
};
void MyClass::IA::method(int i) {
cout << "IA::method " << i << endl;
}
void MyClass::IB::method(const string& s) {
cout << "IB::method " << s << endl;
}
Visual C ++ 2017 сообщает об этой ошибке:
«Метод C2509: функция-член не объявлена в« MyClass »»
Из любопытства я скомпилировал объявления двух классов, используя другие компиляторы (g ++ и clang), и они оба не смогли скомпилироваться.
Это какое-то специфическое поведение для Visual C ++?