#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 .