C++2440错误-编译器认为字符串是常量字符



所以我有一个小片段,它认为"abc"不是一个字符串,而是一个const char[4],所以我不能将它分配给我的对象。我搜索过,但没有找到任何有效的解决方案。提前谢谢。

Tekst t = "abc";
Tekst Tekst::operator=(std::string& _text){
return Tekst(_text);
}

编辑:由于这是我的面向对象编程课程中几乎每一个练习的主要内容,无论出于何种原因,我们都无法更改int main()中的任何内容,因此更改Tekst t = "abc";是不可能的。

编辑2:Tekst(std::string _text) :text(_text) {};

编译器不认为"abc"const char [4]。它是const char [4],而您认为它应该是std::string,这是不正确的。std::string可以由const char *隐式构造,但它们并不完全相同。

您的问题实际上是试图将临时绑定到非常量引用,这在C++中是不可能的。您应该将操作员的定义更改为

Tekst Tekst::operator=(const std::string& _text){
//                     ^ const here
return Tekst(_text);
}

这将使您的运算符在技术上有效(如中所示,它会编译并且没有未定义的行为(。然而,它做了一些非常不直观的事情。考虑以下内容:

Tekst t;
t = "abc";

在本例中,t内部没有任何"abc"。新返回的对象被丢弃,并且t保持不变。

最有可能的是,你的运营商应该是这样的:

Tekst& Tekst::operator=(const std::string& _text){
this->text = _text; //or however you want to change your object
return *this;
}

请参阅运算符重载的基本规则和习惯用法,以了解有关每个运算符中期望的内容和不期望的内容的更多信息。


在一个半相关的注释中,您可以从C++14及以上版本的文字中获得std::string

#include <string>
using namespace std::string_literals;
int main() {
auto myString = "abc"s; 
//myString is of type std::string, not const char [4]
}

然而,这对您的情况没有帮助,因为主要问题是将临时引用绑定到非常量引用。

感谢@Ted Lyngmo,"这应该会有所帮助:godbolt.org/z/j_RTHu",我所要做的就是添加一个单独的构造函数来接收const char*

Tekst(const char* cstr) : Tekst(std::string(cstr)) {}

Tekst t = "abc";只是Tekst t("abc");的语法糖,这意味着它甚至根本不考虑您的operator=,而是使用类的构造函数。

为了编译Tekst t = "abc";,您需要一个接受const char*const std::string&作为输入的构造函数。但是,您展示的构造函数按值而不是按常量引用获取std::string,因此它不能用于字符串文字。因此,您需要为此添加一个新的构造函数:

Tekst(const char *_text) :text(_text) {};

相关内容

  • 没有找到相关文章

最新更新