Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/147.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/visual-studio-2010/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 操作员<&书信电报;栈溢出_C++_Visual Studio 2010 - Fatal编程技术网

C++ 操作员<&书信电报;栈溢出

C++ 操作员<&书信电报;栈溢出,c++,visual-studio-2010,C++,Visual Studio 2010,考虑以下代码: class TextMessage{ public : TextMessage(){}; TextMessage(std::string _text):text(_text){} std::string text; friend std::ostream & operator<<( std::ostream & os, const TextMessage & m); }; std::ostream & o

考虑以下代码:

class TextMessage{
public :
    TextMessage(){};
    TextMessage(std::string _text):text(_text){}
    std::string text;
    friend std::ostream & operator<<( std::ostream & os, const TextMessage & m);
};
std::ostream & operator<<( std::ostream & os, const TextMessage & m){
    return os << "text message : " << m.text;
}
class文本消息{
公众:
TextMessage(){};
text消息(std::string _text):text(_text){}
std::字符串文本;

friend std::ostream&operator我猜您未能
#include
。因此,当编译器输出
std::string
时,它不能,并开始寻找隐式转换-您对TextMessage的隐式构造函数看起来就像账单。但是,等等-现在我们正在TextMessage的它的原因是
m.text
std::string
,它在操作符内部被转换为
TextMessage
,然后操作符被再次调用。

我能想到的唯一一件事是它没有操作符。这对我来说很好,所以你的代码中肯定还有其他错误…我也这么认为,但是
std::string
在用作(非指针)之前不需要是一个完整的类型吗成员变量?是流插入操作符,显然是。@本:VisualC++标准库实现中除“代码> >代码之外的一些头项引入了 STD::String < /Cord>”,但仅<代码> <代码>引入了流运算符重载。例如,如果<代码>包含了< /代码>(并且不包括
),那么
int main(){std::string s;}
将起作用,但是
int main(){std::string s;std::cout如果这是正确的,那么声明构造函数
explicit
..@Calvin1602是完全合法的,任何标准头都包含所有或部分(在本例中,是其他标准标题的
std::string
)的定义。因此,您完全可以合法地
#include
并获得
std::string
的完整定义,但只有在
#include
@DeadMG时才能获得插入/提取运算符。您能否指出标准中的“全部或部分”位置我在我的副本中发现的是({ 7.4.4.1)“一个C++头可以包括其他C++头。”没有提到部分。(很明显,这是一个学术问题:是否包括一个部分是合法的或不合法的,这是大多数实现所做的,我们必须忍受它。)+1用于使构造函数显式。禁止隐式转换始终是一个好主意。+1.几周前,我发誓总是在我的构造函数上编写
explicit
,而bam已经忘记了。
explicit TextMessage(std::string _text):text(_text){}