为什么我不能发出字符串?


143

为什么我不能cout string这样:

string text ;
text = WordList[i].substr(0,20) ;
cout << "String is  : " << text << endl ;

当我这样做时,出现以下错误:

错误2错误C2679:二进制'<<':未找到采用'std :: string'类型的右侧操作数的运算符(或没有可接受的转换)c:\ users \ mollasadra \ documents \ visual studio 2008 \ projects \ barnamec \ barnamec \ barnamec.cpp 67 barnamec **

令人惊讶的是,即使这样也不起作用:

string text ;
text = "hello"  ;
cout << "String is  : " << text << endl ;

您可以编辑错误消息吗?
Troyen

1
#include <iostream>
Konerak 2011年

没有足够的信息。错误是什么
alexD

我已经做到了。但是同样,我有问题。
Ata

您可以发布整个文件吗?我们不知道您是否要在函数中调用此函数,是否包含正确的内容,等等...
Konerak 2011年

Answers:


241

您需要包括

#include <string>
#include <iostream>

7
并且也using namespace stdusing std::cout; using std::endl;
fardjad 2011年

2
是的,但是我想它包括在内,因为string text;编辑也没有错误(添加错误),这不是问题,而是缺少的string标题。
Kiril Kirov

57
+1:Visual C ++中的许多STL标头(包括<iostream>)都引入了std::basic_string类的定义(因为它们间接包含实现定义的<xstring>标头(从不直接包含标头))。尽管这允许您使用字符串类,但相关内容operator<<是在<string>标头本身中定义的,因此您必须手动添加它。还依赖于其他标头间接包含std::basic_stringVC ++ 中作品的定义,但它不适用于所有编译器。
斯文(Sven)

6
Sven-您的评论很棒!我有一个与此提问者类似的问题,编译器表示未为std :: cin和std :: string类型定义运算符>>。原来我有<iostream>,但忘记了<string>。我曾经在带有gcc的linux上工作,这会抱怨没有定义std :: string。您的评论很好地说明了为什么我们反而遭到了运营商的投诉。谢谢!!
丹尼尔·戈德法布

2
这可行。我错过了代码中的#include <string>行。谢谢。

11

您需要以std某种方式引用cout的名称空间。例如,插入

using std::cout;
using std::endl;

在函数定义或文件之上。


6

您的代码有几个问题:

  1. WordList没有在任何地方定义。您应该先定义它,然后再使用它。
  2. 您不能只在此类函数之外编写代码。您需要将其放入函数中。
  3. #include <string>在使用cout或之前,需要先使用字符串类和iostream endl
  4. stringcoutendl住在std命名空间,所以你不能没有用前缀访问它们std::,除非你使用的using指令,以使它们的范围第一次。

他们都没有为我工作,似乎问题在于substr
Ata

1

上面的答案很好,但是如果您不想添加字符串包含,则可以使用以下内容

ostream& operator<<(ostream& os, string& msg)
{
os<<msg.c_str();

return os;
}

0

使用c_str()将std :: string转换为const char *。

cout << "String is  : " << text.c_str() << endl ;

-1

您不必引用std::coutstd::endl显式。
它们都包含在中namespace stdusing namespace std而不是::每次都使用范围解析运算符使操作变得更加轻松和整洁。

#include<iostream>
#include<string>
using namespace std;

5
欢迎使用StackOverflow,您可能没有注意到,但已在接受答案的评论之一中解决了此问题。
Andon M. Coleman

-3

如果您使用的是Linux系统,则需要添加

using namespace std;

标题下方

如果是Windows,请确保正确放置标题 #include<iostream.h>

#include<string.h>

引用它,它完美地工作。

#include <iostream>
#include <string>

int main ()
{
std::string str="We think in generalities, but we live in details.";
                                       // (quoting Alfred N. Whitehead)

  std::string str2 = str.substr (3,5);     // "think"

   std::size_t pos = str.find("live");      // position of "live" in str

  std::string str3 = str.substr (pos);     
// get from "live" to the end

  std::cout << str2 << ' ' << str3 << '\n';

  return 0;
}

using namespace std;与目标操作系统无关linux。类似地,将.hinclude 添加到include与目标操作系统是Windows无关,#include <iostream>并且#include <string>可以在Windows上运行。
StaticBeagle
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.