因为遇到了这个操作符的问题,所以在这里记录一下*~*。
一、问题描述
二、产生原因
因为也是第一次出现这个问题,所以就到网上查了一些资料和书籍,现在倒也大概理解了这个错误出现的原因了。
有时候举个例子可能更容易理解为啥会出现这个错误,就拿一本书中的例子来说一下,如下所示:
template<class T>
class NamedObject {
public:
NamedObject(std::string& nameVal, const T objectVal)
:nameVal(nameVal),objectVal(objectVal)
{}
NamedObject& operator=(const NamedObject&) = default;
private:
std::string& nameVal;
const T objectVal;
};
void main() {
std::string newDog = "PersonPhone";
std::string oldDog = "Person";
NamedObject<int> p(newDog, 2);
NamedObject<int> s(oldDog, 1);
p = s;
}
编译器会直接报错:
而出现这个错误的原因其实就是在调用“operator=”这个函数的时候发生了一些阻止赋值动作发生的行为,所以才导致编译器拒绝编译这行代码。上面的例子中其实就是string&和const在阻止赋值动作的发生,“让reference指向其他对象”和“改变const变量内容”本身就违反了C++的语法规范,所以才导致了这个错误发生。
三、解决方案
既然知道了问题出在哪了,只需要对症下药就行了,如下所示:
template<class T>
class NamedObject {
public:
NamedObject(std::string& nameVal,objectVal(objectVal)
{}
NamedObject& operator=(const NamedObject&) = default;
void show() {
std::cout << nameVal << "\t" << objectVal << std::endl;
}
private:
std::string nameVal;
T objectVal;
};
void main() {
std::string newDog = "PersonPhone";
std::string oldDog = "Person";
NamedObject<int> p(newDog, 1);
p = s;
p.show();
s.show();
std::cin.get();
}
运行效果:
原文地址:https://blog.csdn.net/dayuhaitang1/article/details/109271738
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。