Почему вылезает ошибка c2280?

182
20 июля 2018, 06:40

Задача следующая: Реализовать c++ объект, который предоставил бы возможность менять тип данных во время исполнения. Хранение значения типа данных должно храниться с использованием xml.Тут должны поддерживаться операции преобразования типов между "однотипными" данными; Операции между типами данных, которые не согласуются между собой должны вызывать исключения. Т.е. например: ten+P= 13; twenty+str исключение

header.h

#include <iostream>
#include <fstream>
#include <string>
#include <typeinfo>
#include <stdarg.h>
#include <vector>
using namespace std;
ofstream xml;
class Object {
public:
    ifstream fin;
    string path = "xml.txt";
    template <typename T>
    Object(T);
    Object();
    ~Object();
    template <typename T, typename T1, typename T2>
    Object(T, T1, T2);
    template < typename T > 
    Object operator + (T);
private:
    int num;
    int& Count();
    template <typename T>   
    void value(T);
    void open();    
    void close();
    string type;
};


void Object::open(){
    char buff[3];
    num = ++Count();
    _itoa_s(num, buff, 10);
    xml << "<" << buff << ">\n";
}
void Object::close() {
    char buff[3];
    _itoa_s(num, buff, 10);
    xml << "</" << buff << ">\n\n\n\n";
}
template <typename T>
void Object::value(T buff) {
    type = typeid(buff).name();
    if (type == "char const *") {type = "string";};
    xml << "<" << type << ">\n";
    xml << "<value>\n";
    xml << buff << "\n";
    xml << "</value>\n";
    xml << "</" << type << ">\n";
}
Object::Object() {
    open(); 
    close();
}
template <typename T>
Object::Object(T buff) {
    fin.open(path);
    open();
    value(buff);
    close();
    fin.close();
};
template <typename T, typename T1, typename T2>
Object :: Object(T buff1, T1 buff2, T2 buff3){
    fin.open(path);
    open();
    value(buff1);
    xml << "\n";
    value(buff2);
    xml << "\n";
    value(buff3);
    xml << "\n";
    close();
    fin.close();
}
int& Object::Count() {
    static int c = 0;
    return c;
}
Object :: ~Object() {
    --Count();
    xml.close();
}
template <typename T>
Object operator+(T &sum)
{
    try {
        if (typeid(value).name != typeid(sum.value))
            throw 666;
    }
    return T(this->value + sum.value);
    catch (int i){
        cout << "Error" << endl;
    }
}

main.cpp

#include "header.h"
#pragma once
int main() {
    ifstream fin;
    xml.open("xml.txt");
    Object arr(120, 23.5, "Word");
    Object arr1(1, 2, 3);
    Object arr2(15.5, 25.2, 22.3);
    Object ten = 10;
    Object twenty = 20;
    Object P = 3.14;
    Object str = "Course";
    Object str1 = "Program";
    Object boolean = false;
    Object boo = true;
    Object st("Hello!", "World", "WoW!");
    Object sum;
    sum = ten + P;

    return 0;
    }

У меня выдает ошибку:

Ошибка 1 error C2280: "std::basic_ifstream>::basic_ifstream(const std::basic_ifstream> &)": предпринята попытка ссылки на удаленную функцию c:\users\user\documents\visual studio 2013\projects\course\course\main.cpp 25 1 course В месте

sum = ten + P;

Помогите разобраться, как её исправить, что бы все работало?

Answer 1

sum = ten + P; выполняет вызов неявно сгенерированного копирующего оператора присваивания, который будет копировать все поля класса, включая fin, однако объекты ifstream являются некопируемыми. Однако они могут быть перемещены. Соответственно для своего класса следует реализовать перемещающий оператор присваивания (и перемещающий конструктор за одно). Однако в данном случае на самом деле нет никакого смысла держать fin среди полей класса, так как он используется исключительно как локальная переменная.

READ ALSO
Не работает флаг смены хода

Не работает флаг смены хода

Есть публичное поле класса — gamer, которое служит флагом смены хода

184
Не могу собрать и запустить qt проект

Не могу собрать и запустить qt проект

Скачал я qt и Qt,и решил поизучать,посмотреть

259
variadic templates

variadic templates

Имеется шаблонная функция, принимающая строки

217
Как соединить два и более std::stringstream

Как соединить два и более std::stringstream

Возможно ли записать два и/или более std::stringstream в один?

217