Dyikot
@Dyikot

Реализую свойства, но почему у string требует перегрузку для cout?

Класс своства:
template<typename T>
class Property
{
private:
    T& _value;
public:
    Property(T& value):
        _value(value){ }

    void operator=(const T& value)
    {
        _value = value;
    }
    operator T() const
    {
        return _value;
    }
};

Пример класса в котром реализуется свойства:
class Person
{
public:
    Property<int> Age = Property<int>(_age);
    Property<std::string> Name = Property<std::string>(_name);
private:
    int _age;
    std::string _name;
public:
    Person(int age, const std::string& name) :
        _age(age),
        _name(name){ }

    friend std::ostream& operator<<(std::ostream& os, const Person& person)
    {
        os << std::format("Name: {}, Age: {}\n", person._name, person._age);
        return os;
    }
};


int main()
{
    auto person = Person(15, "Alex");
    // std::cout << person;
    std::cout << person.Age << std::endl;
    std::cout << person.Name << std::endl;  // тут ошибки

}

Ошибки:
1. Error (active) E0349 no operator "<<" matches these operands.
2. Error C2679 binary '<<': no operator found which takes a right-hand operand of type 'Property' (or there is no acceptable conversion).
  • Вопрос задан
  • 84 просмотра
Решения вопроса 2
jcmvbkbc
@jcmvbkbc
"I'm here to consult you" © Dogbert
Property<std::string> Name = Property<std::string>(_name);
…
std::cout << person.Name << std::endl;  // тут ошибки

почему у string требует перегрузку для cout?

Потому что Property<std::string> -- это не string. Хоть у тебя и есть Property<T>::operator T() const ничто в твоём коде не говорит о том, что Property<std::string> нужно пытаться приводить к string а не к какому-нибудь другому типу.
Ответ написан
wataru
@wataru Куратор тега C++
Разработчик на С++, экс-олимпиадник.
Ну, у вас person.Age - это Property<int>. Как его в cout выводить вы нигде не определяли, про это компилятор и ругается. У Property вы, правда, определили приведение к int. так-что вот это сработает:
cout << static_cast<int>(person.Age);

Но сам компилятор догадаться, что это надо к инту приводить не может.

Вам надо также, как вы operator<< для Person определили, определить его для Property<T>.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы