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

时间:2016-10-01 14:24:14

标签: c++ visual-studio compiler-errors operator-overloading

HI。在我的问题之前,我已经查看了其他线程中的相同错误,没有任何对我有用。 我的问题代码位于in >> a.name >> a.extension;。当我自己测试时,如果我将类型从string更改为char我的变量,它会起作用,但我无法使用string类型的值。

我做错了吗? 低于compillation的完整错误代码(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;
}

2 个答案:

答案 0 :(得分:3)

这里的关键词是const,这意味着该事物无法修改。

您正在尝试修改const内容。你做不到。

您的功能与任何operator>>一般都应该声明如下:

friend istream& operator>>(istream& in, Soft& a) 

我所做的更改是删除const

顺便说一句,我认为你的成员变量sizedateTime没有任何理由成为动态分配整数的指针。如果您只是将它们设为正常整数,那么您的代码将更简单

答案 1 :(得分:0)

赋值运算符的l值不能保持不变,因为此运算符会更改值,因此尝试更改常量值是试图破坏规则。

查看插入操作符:

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

这里没关系,因为插入操作符只是用来打印值(const和非const)而不改变它们。

***如果您真的需要打破常量规则,请将您的成员数据声明为可变:

     mutable int *size;
     mutable time_t *dateTime;

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