C++ 错误C++;2679(二进制';>;';:未找到接受';const std::string'类型的右操作数的运算符;(或没有可接受的转换))

C++ 错误C++;2679(二进制';>;';:未找到接受';const std::string'类型的右操作数的运算符;(或没有可接受的转换)),c++,visual-studio,compiler-errors,operator-overloading,C++,Visual Studio,Compiler Errors,Operator Overloading,你好。在我提问之前,我已经查看了其他有相同错误的线程,没有任何东西对我有效。 我的问题代码位于a.name>>a.extension中的。正如我自己测试的那样,如果我将变量的类型从string更改为char,它将起作用,但我无法使它与string类型的值一起工作 我做错什么了吗? 下面是编译的完整错误代码(Visual Studio 2015) 错误C2679二进制“>>”:找不到使用右手的运算符 “const std::string”类型的操作数(或没有可接受的 转换) 提前谢谢 #inclu

你好。在我提问之前,我已经查看了其他有相同错误的线程,没有任何东西对我有效。 我的问题代码位于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 Soft&source);
    ~Soft();

    friend istream& operator>> (istream& in, const Soft& 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 Soft&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;
}
#包括
#包括
#包括
使用名称空间std;
类软{
私人:
整数*大小;
时间*日期时间;
公众:
字符串名;
字符串扩展;
软();
软(弦,弦);
软件(const-Soft和source);
~Soft();
friend istream&operator>>(istream&in、const Soft&a)
{
在>>a.name>>a.extension中;
返回;
};
void changeName(字符串);
无效更改扩展名(字符串);
};
Soft::Soft(){
大小=新整数;
*尺寸=0;
名称=字符串(“”);
扩展名=字符串(“”);
dateTime=新时间\u t;
*dateTime=时间(nullptr);
}
Soft::Soft(const-Soft和source){
name=source.name;
extension=source.extension;
大小=新整数;
*size=*source.size;
dateTime=新时间\u t;
*dateTime=时间(nullptr);
}
Soft::Soft(字符串a、字符串b){
名称=a;
扩展=b;
dateTime=新时间\u t;
*dateTime=时间(nullptr);
}
Soft::~Soft(){
删除[]大小;
删除[]日期时间;
}
void Soft::changeExtension(字符串a){
扩展=a;
}
void Soft::changeName(字符串a){
名称=a;
}
int main(){
软a;
getchar();
getchar();
返回0;
}

这里的关键词是
const
,这意味着该内容无法修改

您正试图修改一个
const
对象。你不能那样做。

通常,您的函数与任何
运算符>>
一样,应该这样声明:

friend istream& operator>>(istream& in, Soft& a) 
我所做的更改是删除
常量


顺便说一下,我认为没有任何理由让您的成员变量
size
dateTime
成为指向动态分配整数的指针。如果你只把它们变成普通整数,你的代码会简单得多。

这里的关键词是
const
,这意味着这个东西不能修改

您正试图修改一个
const
对象。你不能那样做。

通常,您的函数与任何
运算符>>
一样,应该这样声明:

friend istream& operator>>(istream& in, Soft& a) 
我所做的更改是删除
常量


顺便说一下,我认为没有任何理由让您的成员变量
size
dateTime
成为指向动态分配整数的指针。如果只将它们设为普通整数,代码将简单得多。

赋值运算符的l值不能是常量,因为该运算符会更改值,因此尝试更改常量值就是试图打破规则

请看插入运算符:

ostream& operator <<(ostream&, const myCalss&); // here const is ok

但在您的示例中,您不需要这样做,我只是解释您可以更改cont变量。

赋值运算符的l值不能是常量,因为该运算符更改值,因此尝试更改常量值是试图打破规则

请看插入运算符:

ostream& operator <<(ostream&, const myCalss&); // here const is ok

但在您的示例中,您不需要这样做,我只是解释您可以更改cont变量。

我也不明白,但我的学校老师希望所有内容都带有指针。。。它是显式编写的,用于对所有对象使用指针variables@M.Eugen:那太可笑了。有人教你如何做错事(@LightnessRacesinOrbit:你没被教过‘mutable’关键字的作用吗?他可以将他的成员数据声明为mutable,然后他的例子就可以了fine@Raindrop7:他为什么要这样做?只需正确声明运算符…将对象的
常量
引用带入一个函数是没有意义的,该函数的唯一目的是使答案就在下面,我说你甚至可以做傻事。但是我没有建议他去做,所以我也看不见,但是我的学校老师想要所有的东西都有指针……这是明确写的,所有的东西都使用指针variables@M.Eugen:那太可笑了。有人教你怎么做错事(@LightnessRacesinOrbit:你没被教过‘mutable’关键字的作用吗?他可以将他的成员数据声明为mutable,然后他的例子就可以了fine@Raindrop7:为什么要这样做?只需正确声明运算符……将对对象的引用转换为唯一目的是改变答案就在下面,我说你甚至可以做傻事,但我没有建议他这么做