Не могу понять, почему ругается компилятор

87
09 декабря 2021, 17:20

Решил попробовать создать двоичный тип данных для вводимых чисел, а также функции конъюнктирования и дизъюнктирования к ним. Однако в какой-то момент что-то пошло не так.

#pragma once
#include <iostream>
#include <string>
#include <cmath>
#include <cassert>
struct Binary
{
private:
    std::string value;
    std::string to_binary(int number);
    std::string con(std::string value, std::string value_1);
    int to_int(std::string value);
public:
    Binary(int value_) :
        value(to_binary(value_))
    {
        //
    }
    Binary(Binary& type);
    Binary& operator= (Binary& type) {
        if (value == type.value) {
            return *this;
        }
        value = type.value;
        return *this;
    }
    Binary& operator+ (Binary& type){
        return Binary(to_int(con(value, type.value)));
    }
    friend std::ostream& operator<< (std::ostream& out, Binary& type);
};

Ошибка  C2440   return: невозможно преобразовать "Binary" в "Binary"     
Обучение заколовкам C:\Users\User\source\repos\Обучение заколовкам\Binary.h 29      
Answer 1
  1. И конструктор копирования, и оператор присваивания, и оператор +, и operator<< должны получать свои Binary параметры по константной ссылке.
  2. Оператор + должен быть const сам по себе. А лучше было бы реализовать его самостоятельной [friend] функцией, а не методом класса.
  3. Оператор присваивания обычно возвращает свой результат по ссылке, а оператор + должен возвращать свой результат по значению. Код на скриншоте в этом отношении не совпадает с кодом в тексте, т.е. видно, что вы метались туда-сюда, но но и там и там неправильно.
  4. Проверка if (value == type.value) в операторе присваивания - бессмысленная трата времени и явная пессимизация. В данном случае проверка на самоприсваивание не нужна, но если вы хотите ее сделать, то это if (this == &type).
Answer 2

Дело в том, что Ваш конструктор копирования обьявлен с параметром Binary&, а operator+ возвращает обьект Binary по значению и для этого ему нужен конструктор копирования. Но Binary(to_int(con(value, type.value))) является rvalue, а не константная ссылка не может ссылаться на rvalue. Решение: обьявите конструктор копирования так:

Binary(const Binary& type);
READ ALSO
Qt - парсинг запроса на сервере в QTcpSocket

Qt - парсинг запроса на сервере в QTcpSocket

Есть сервер TCP QTcpServer tcp и сокет подключения QTcpSocket socketПодключаю я их вот так:

92
Вызов основного окна после авторизации с точки зрения MVVM паттерна C# WPF

Вызов основного окна после авторизации с точки зрения MVVM паттерна C# WPF

Подскажите пожалуйста, как вызывать после окна авторизации окно с основным функционалом(дочернее окно), при этом нужно использовать mvvm паттерн

212