C++: двусмысленность в классе
Я пытаюсь спроектировать такие классы, где один из них - шаблонный класс, но я получаю неоднозначную ошибку.
template <class v>
class Base
{
protected:
vector <v> data;
void sortByStr (string (v::*) () );
};
class Person : Base <Person>
{
string szSurname;
string szPhoneNum;
public:
Person (string surname = "default", string phoneNum = "000 000 000")
: szSurname (surname), szPhoneNum (phoneNum)
{
};
virtual void sortBySurname() {sortByStr (&Person::getSurname);};
virtual void sortByPhone() {sortByStr (&Person::getPhone);};
};
class Worker : public Base <Worker>,
public Person
{
private:
string szPosition;
int nAge;
bool isBusy;
public:
Worker (string surname = "Not Specified",
string phone = "000-000-000",
string position = "none",
short age = 0,
bool busy = 0);
: Person (surname, phone), szPosition (position), nAge (age), isBusy (busy)
{};
void sortByPosition(){sortByStr (&Worker::getPosition);}; // <-sortByStr ambiguous
void sortByAge() {sortByNum (&Worker::getAge);}; // <-sortByStr ambiguous
void sortByStatus() {sortByBool(&Worker::getBusyStatus);}; // <-sortByStr ambiguous
};
Я получил:
/ Projekt v1.0 / people.h || В функции-члене 'void Worker::sortByPosition()': |
/ Projekt v1.0 / people.h | 76 | ошибка: ссылка на sortByStr неоднозначна |
/ Projekt v1.0 / base.h | 17 | примечание: кандидаты: void Base:: sortByStr (std:: string (v:: *) ()) [with v = Person; std:: string = std:: basic_string] |
/ Projekt v1.0 / base.h | 17 | note: void Base:: sortByStr (std:: string (v:: *) ()) [with v = Worker; std:: string = std:: basic_string] |
Можно ли избежать такой ошибки в этом конкретном примере? Я пытался (только для проверки) реализовать класс Worker, производный только от Base. Это работает, но мне нужен доступ к Person from Worker в моем проекте. Я действительно ценю помощь:)
1 ответ
Это связано с тем, что класс Base наследуется дважды в классе Worker, один напрямую и один от класса Person, поскольку он также наследует Base. Таким образом, в работнике класса есть две копии метода Base::sortByStr(), одна из Person(которую он получает из Base), одна из самой Base, и, таким образом, компилятор не понимает, какую из них вызывать. Чтобы избежать этого, вы можете использовать виртуальное наследование для класса Person.
class Person: virtual public Base<Person> { ...};