问题 C ++错误 - 表达式必须具有整数或枚举类型 - 从带有连接的字符串中获取它?


C ++错误 表达式必须具有整数或枚举类型 从串联的字符串中得到这个?

所以在 toString() 在C ++中的类我有代码:

string bags = "Check in " + getBags() + " bags";

我以为我可以声明这样的字符串? (我来自Java背景并尝试学习C ++)。该 bags 在Visual Studio中有下划线,问题是:

表达式必须具有整数或枚举类型。

getBags() 只是返回一个 int

发生这种情况的另一个例子是:

string totalPrice = "Grand Total: " + getTotalPrice();

getTotalPrice() 返回一个 float 并且是错误的下划线。

但是如果我输入一行如下:

string blah = getBags() + "blah";

没有错误。

我在这里不理解什么?


924
2018-03-31 03:49


起源



答案:


"Check in " 实际上是一个 const char *。 添加 getBags() (一个 int)它产生另一个 const char*。生成编译器错误是因为您无法添加两个指针。

你需要转换它们 "Check in " 和 getBags() 连接之前的字符串:

string bags = std::string("Check in ") + std::to_string(getBags()) + " bags";

" bags" 将被隐式转换为 string


13
2018-03-31 04:02



只有在使用c ++ 11时才能使用std :: to_string - SHR
有谁知道哪个Visual Studio版本支持C ++ 11? - CPlusPlus OOA and D
vs11或vs12。我不确定。 - SHR
是否有必要在“签入”周围使用std :: string()?这也不会被隐式转换为字符串吗? - aquirdturtle
@aquirdturtle - 是的, "Check in " 将被隐式转换为 std::string,因此没有必要进行显式转换。 - Ferruccio


答案:


"Check in " 实际上是一个 const char *。 添加 getBags() (一个 int)它产生另一个 const char*。生成编译器错误是因为您无法添加两个指针。

你需要转换它们 "Check in " 和 getBags() 连接之前的字符串:

string bags = std::string("Check in ") + std::to_string(getBags()) + " bags";

" bags" 将被隐式转换为 string


13
2018-03-31 04:02



只有在使用c ++ 11时才能使用std :: to_string - SHR
有谁知道哪个Visual Studio版本支持C ++ 11? - CPlusPlus OOA and D
vs11或vs12。我不确定。 - SHR
是否有必要在“签入”周围使用std :: string()?这也不会被隐式转换为字符串吗? - aquirdturtle
@aquirdturtle - 是的, "Check in " 将被隐式转换为 std::string,因此没有必要进行显式转换。 - Ferruccio


当使用+来追加字符串时,第一个元素必须有operator +,const char *没有它。

因此你应该从它做一个字符串:

string bags = string("Check in ") + getBags() + " bags";

或者按步骤进行:

string bags = string("Check in ") + getBags() + " bags";

编辑: 更多问题是从方法返回的int,由于某种原因,字符串没有operator + for int。

所以你最好像这样使用stringstream:

#include <sstream>
....
ostringstream s;
s<<"Check in " << getBags() << " bags";
string bags = s.str();

1
2018-03-31 03:53





尝试 std::to_string(getBags())。您只能使用字符串连接字符串。


0
2018-03-31 03:52



在这种情况下,我是否必须为getBages专门设置toString函数,或者默认情况下to_string()只返回getBags()返回的任何内容(以字符串形式)?那么,如果int bags = 5 to_string(getBags())将打印为5?谢谢。 - SuperCow
您不必创建自己的函数,因为std :: to_string()是<string>库的一部分。 资源。 - Lee Thomas
只有在使用c ++ 11时才能使用std :: to_string - SHR
@SHR我认为更通用的解决方案更好,但他说他使用的是自2010年以来一直支持C ++ 11的Visual Studio。 - Lee Thomas