Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/143.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+中的运算符+;?_C++_Operator Overloading - Fatal编程技术网

C++ 如何正确地超载<<&引用;C+中的运算符+;?

C++ 如何正确地超载<<&引用;C+中的运算符+;?,c++,operator-overloading,C++,Operator Overloading,我想做一个类似于std::cout的行为: int a = 10, b = 15, c = 7; MyBaseClass << "a = " << a << ", b = " << b << std::endl; 当我编译这个时,我得到:“调用隐式删除了‘MyBaseClass’的默认构造函数”-我需要做什么来修复它 OS X、Xcode、clang编译器都是最新的。您正试图将各种值类型输出到MyBaseClass对象中,因此需要支持

我想做一个类似于std::cout的行为:

int a = 10, b = 15, c = 7;
MyBaseClass << "a = " << a << ", b = " << b << std::endl;
当我编译这个时,我得到:“调用隐式删除了‘MyBaseClass’的默认构造函数”-我需要做什么来修复它


OS X、Xcode、clang编译器都是最新的。

您正试图将各种值类型输出到
MyBaseClass
对象中,因此需要支持同一组。我还将
someOut
更改为
std::ostringstream
,它能够累积输出。您可能同样希望它是传递给构造函数的调用方提供的流的
std::ostream&

class MyBaseClass {
    private:
        std::ostringstream someOut;
    public:
        ...other functions...
        // The second try:
        template <typename T>
        MyBaseClass& operator<< ( const T& x ) {
            someOut << x;
            return *this;
        }

        void writeMyOut() const { 
            std::cout << someOut.str() 
        };
};
类MyBaseClass{
私人:
std::ostringstream someOut;
公众:
…其他功能。。。
//第二次尝试:
模板

MyBaseCasass和操作员可能是C++初学者的“朋友”函数,我认为你的第二次尝试应该或多或少地工作。编译错误可能是因为<代码> MyBaseClass < /C>没有构造函数,但是你需要一个初始化<代码>某个[成员]。(我不是100%确定这是问题所在,但是如果你为
MyBaseClass
提供一个构造函数,我想你会做得更进一步。具体地说,我认为你可以尝试在未初始化的
std::ostream
上编写
someOut
)@DaveM.-如果我添加一个空构造函数,我会得到:
类型为'std::ostream'(也称为'basic_ostream'的字段)已保护默认构造函数
@Joel:这个问题不是关于创建一个
运算符的问题,问题是,您没有初始化
std::ostream
。我不确定您是否可以创建一个普通的
ostream
——您通常要么创建一个流的
,要么创建一个
ostringstream
(现在可能被称为
ostream
?我忘了。)试着用
std::ostringstream
替换
std::ostream
。在这种情况下,我得到:
调用隐式删除的“MyBaseClass”默认构造函数
@JavaRunner:您自己提供过任何
MyBaseClass
构造函数吗(可能是在DaveM的提示下)如果是这样,请删除它们。使用
std::ostream&someOut;
您需要
MyBaseClass(std::ostream&os):someOut(os){<代码>,但是不需要为<代码> STD::OSTRIGSWATHON/COD>指定任何构造函数。谢谢,你的解决方案工作得像个符咒!这是我的错。@ JavaRunner:当然,不用担心。希望你喜欢C++代码。干杯。
class MyBaseClass {
    private:
        std::ostringstream someOut;
    public:
        ...other functions...
        // The second try:
        template <typename T>
        MyBaseClass& operator<< ( const T& x ) {
            someOut << x;
            return *this;
        }

        void writeMyOut() const { 
            std::cout << someOut.str() 
        };
};