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> { ...};
Другие вопросы по тегам