C++ 如何正确地超载<<&引用;C+中的运算符+;?
我想做一个类似于std::cout的行为: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对象中,因此需要支持
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()
};
};