Ошибка C 2679 (двоичный файл ‘>>’: не найден оператор, который принимает правый операнд типа ‘const std::string’ (или нет приемлемого преобразования))

#c #visual-studio #compiler-errors #operator-overloading

#c #visual-studio #ошибки компилятора #перегрузка оператора

Вопрос:

привет. Перед моим вопросом я просмотрел другие потоки с той же ошибкой, у меня ничего не получилось.Мой проблемный код находится в in >> a.name >> a.extension; . Как я проверил сам, если я изменю тип с string на char для своих переменных, это будет работать, но я не могу заставить его работать с string типом значения.

Я делаю что-то не так? Ниже приведен полный код ошибки при компиляции (Visual Studio 2015)

Ошибка C2679 двоичный файл ‘>>’: не найден оператор, который принимает правый операнд типа ‘const std::string’ (или нет приемлемого преобразования)

Заранее спасибо.

 #include <iostream>
#include <ctime>
#include <string>
using namespace std;

class Soft {
private:
    int *size;
    time_t *dateTime;
public:
    string name;
    string extension;
    Soft();
    Soft(string, string);
    Soft(const Softamp;source);
    ~Soft();

    friend istreamamp; operator>> (istreamamp; in, const Softamp; a) 
    {
        in >> a.name >> a.extension;
        return in;
    };

    void changeName(string);
    void changeExtension(string);
};

Soft::Soft() {
    size = new int;
    *size = 0;
    name = string("");
    extension = string("");
    dateTime = new time_t;
    *dateTime = time(nullptr);
}

Soft::Soft(const Softamp;source) {
    name = source.name;
    extension = source.extension;
    size = new int;
    *size = *source.size;
    dateTime = new time_t;
    *dateTime = time(nullptr);
}

Soft::Soft(string a, string b) {
    name = a;
    extension = b;
    dateTime = new time_t;
    *dateTime = time(nullptr);
}

Soft::~Soft() {
    delete[] size;
    delete[] dateTime;
}

void Soft::changeExtension(string a) {
    extension = a;
}
void Soft::changeName(string a) {
    name = a;
}


int main() {

    Soft a;

    getchar();
    getchar();
    return 0;
}
  

Ответ №1:

Ключевое слово здесь const , что означает, что вещь не может быть изменена.

Вы пытаетесь что-то изменить const . Вы не можете этого сделать.

Ваша функция, как и любая operator>> в целом, должна быть объявлена следующим образом:

 friend istreamamp; operator>>(istreamamp; in, Softamp; a) 
  

Внесенное мной изменение заключается в удалении const .

Кстати, я не вижу никаких причин для того, чтобы ваши переменные size -члены dateTime были указателями на динамически распределяемые целые числа. Ваш код будет намного проще, если вы просто сделаете их обычными целыми числами.

Комментарии:

1. Я тоже не вижу, но мой школьный учитель хочет, чтобы все было с указателями… Явно написано использовать указатели для всех переменных

2. @M.Eugen: Это смешно. Вас учат, как это сделать неправильно. 🙁

3. @LightnessRacesinOrbit: разве вас не учили, что делает ключевое слово ‘mutable’?? он может объявить свои данные-члены как изменяемые, и тогда его пример будет работать нормально

4. @Raindrop7: зачем ему это делать? Просто правильно объявите оператор… нет смысла переносить const ссылку на объект в функцию, единственной целью которой является изменение этого объекта.

5. @LightnessRacesinOrbit: ответ ниже, я сказал, что ты можешь даже быть глупым. но я не советовал ему это делать

Ответ №2:

L-значение оператора присваивания не должно быть постоянным, поскольку этот оператор изменяет значения, поэтому попытка изменить постоянное значение является попыткой нарушить правила.

посмотрите на оператор вставки:

 ostreamamp; operator <<(ostreamamp;, const myCalssamp;); // here const is ok
  

здесь все в порядке, потому что оператор вставки используется только для печати значений (const и non-const) без их изменения.

*** если вам действительно нужно нарушить правила постоянства, объявите свои данные-члены как изменяемые:

      mutable int *size;
     mutable time_t *dateTime;
  

но в вашем примере вам не нужно этого делать, я просто объясняю, что вы можете изменить переменную cont .