马上,没有这不是重复。我一直在寻找几个小时来做这件事,但是几周前我开始编码可能很简单。
我希望能够做到这一点,但它不起作用:
system("xdotool mousemove " << $2 << " " << $3);
是的,这是C ++,只是我在Bison中使用它,所以 $ 2和$ 3是变量(浮点数)。就像在Bison文件中一样,我有很多事情要做,我希望在一行中有一个解决方案,比如我在这里的格式。
这里的问题实际上是连接。我这样做了,但它仍然无法正常工作,并给了我同样的错误:
string temp = "xdotool mousemove " << $3 << " " << $4; system(temp.c_str());
很抱歉这么多编辑,但我尝试了
system(("xdotool mousemove " + to_string($3) + " " + to_string($4)).c_str());
但它仍然无效:(还有其他想法吗?这次错误说‘to_string’ was not declared in this scope
亲切的问候,
马修萨内拉
答案 0 :(得分:2)
<<
不是字符串连接运算符。您正在考虑的用法是:
std::cout << "The value is " << x << '\n';
仔细检查上述行将表明它根本不涉及使用std::string
; <<
运算符的左侧参数始终为std::ostream&
。 (第一个是明确指定的,另外两个是前一个<<
运算符的结果,在这种情况下返回std::ostream&&
。)
您从编译器获得的错误消息是完全正确的,您应该花时间了解它告诉您的内容,至少如果您的目标是学习如何编写C ++程序。
C ++标准库重载+
运算符以进行std::string
个对象的连接。但像"xdotool"
这样的字符串文字不是std::string
;它是char
的数组。您还可以使用+
将std::string
与C样式字符串(即NUL终止的字符数组)连接起来,但如果参数必须至少有一个std::string
并且没有从数字到字符串的自动转换,也没有+
的重载需要std::string
和数字。如果您使用的是C++11
或更新版本,则可以使用std::to_string
进行显式转换。
在尝试使用<<
运算符时,通常使用类似于输出流的对象,它只是创建一个内存中的字符串缓冲区:std::ostringstream
。 Thar对象实现str
方法以将缓冲区提取为std::string
;请参阅示例here,了解与您想要的内容类似的内容。
但是,正如我所提到的,std::string
不是char
的简单数组,因此您无法将其传递给期望C样式字符串的函数。这包括标准C库中的所有函数,如system
,它们对C ++ std::string
一无所知。因此,您需要使用c_str
对象的std::string
成员函数将其数据提取为C样式字符串。