Как использовать оператор из определенного базового класса в контексте множественного наследования на C ++ - PullRequest
1 голос
/ 19 сентября 2019

Спокойной ночи.Я пишу некоторые коды C ++, и я не могу скомпилировать следующий код на g ++.Это только говорит о том, что std :: string не имеет метода с именем "operator ==".Я знаю, что это не правда, но, возможно, есть некоторые ограничения или проблемы множественного наследования, о которых я пока не знаю.

Код:

#include<string>

struct Object{

    constexpr Object() noexcept = default;
    virtual ~Object() noexcept = default;

    virtual bool operator==( const Object& other) const noexcept = 0;
};


class String : public Object, public std::string{

    virtual ~String() noexcept = default;
    String() noexcept = default;

    virtual bool operator==( const Object& other) const noexcept{

        auto ptr =  dynamic_cast<const String*>(&other);

        return ptr != nullptr &&
            this->std::string::operator==(*ptr);    // here is the error
    }
};

int main(){}

Ошибка:

$ g ++ -std = c ++ 11 test.cpp -o test.run

test.cpp: в функции-члене 'virtual bool String :: operator == (const Object &) const': test.cpp:23:31: ошибка: у класса std :: __cxx11 :: basic_string нет члена с именем operator ==;Вы имели в виду «оператор =»?this-> std :: string :: operator == (* ptr);

Спасибо за внимание и оставьте комментарий, если знаете, в чем здесь проблема.

1 Ответ

1 голос
/ 19 сентября 2019

Он не имеет оператора в качестве участника, это глобальный оператор.

((std::string&)*this) == (*ptr);

См. Раздел функций, не являющихся членами, в документации: https://en.cppreference.com/w/cpp/string/basic_string

...