4
#include <string> 
using String = std::string; 

class Base { 
protected: 
    String value; 
}; 

class Readonly : virtual Base { 
public: 
    const String& method() const { 
     return value; 
    } 
    String& method() { 
     return value; 
    } 
}; 

class Writeonly : virtual Base { 
public: 
    Writeonly& method(const String& value) { 
     this->value = value; 
     return *this; 
    } 
    Writeonly& method(String&& value) { 
     this->value = std::move(value); 
     return *this; 
    } 
}; 

class Unrestricted : public Readonly, public Writeonly {}; 

void usage() { 
    String string; 
    Unrestricted unrestricted; 
    unrestricted.method(string); // ambiguous 
    string = unrestricted.method(); // ambiguous 
} 

Может кто-нибудь объяснить мне, почему эти вызовы методов неоднозначны?Почему эти методы называют неоднозначными?

Они не являются двусмысленными, если их объединяют в «Writeonly» или «Readonly».

Я хотел бы использовать это для свойств доступа к шаблону. Поэтому я хочу иметь возможность использовать экземпляры «Writeonly», «Readonly» и «Unrestricted».

ответ

6

Поскольку компилятор нашел это имя в двух разных областях.

Хитрость заключается в том, чтобы привести оба названия в сферу Unrestricted:

class Unrestricted : public Readonly, public Writeonly { 
    public: 
    using Readonly::method; 
    using Writeonly::method; 
}; 
0

Возможно, вы думаете, это работает, потому что вы думаете, в функции перегрузки. Проблема в том, что разные функции находятся в разных областях. В этом случае у компилятора нет списка перегруженных функций, чтобы выбрать правильный.

Если вы хотите, чтобы он работал, вы должны поставить функции togheter в том же объеме.

 Смежные вопросы

  • Нет связанных вопросов^_^