【发布时间】:2016-04-12 04:51:58
【问题描述】:
我想做出像std::cout 这样的行为:
int a = 10, b = 15, c = 7;
MyBaseClass << "a = " << a << ", b = " << b << std::endl;
我尝试实现一些我刚刚读过的东西,但它对我不起作用。我想在我称之为MyBaseClass 的一类中实现operator。我试过这个:
class MyBaseClass {
private:
std::ostream someOut;
public:
// My first try:
std::ostream &operator<< ( std::ostream &out, const std::string &message ) {
}
// The second try:
std::ostream &operator<< ( const std::string &message ) {
someOut << message << std::endl;
return someOut;
}
void writeMyOut() {
std::cout << someOut.str()
};
};
当我编译这个时,我得到:“调用 'MyBaseClass' 的隐式删除的默认构造函数” - 我需要做什么来修复它?
OS X、Xcode、clang 编译器,都是最新的。
【问题讨论】:
-
我认为你的第二次尝试应该会奏效,或多或少。编译错误可能是因为
MyBaseClass没有构造函数,但是您需要一个来初始化someOut成员。 (我不是 100% 确定这是问题所在,但是如果您为MyBaseClass提供构造函数,我认为您会走得更远。具体来说,我认为您将获得足够远的时间来尝试在未初始化的std::ostream叫someOut。) -
@DaveM。 - 如果我添加一个空的构造函数,我会得到:
Field of type 'std::ostream' (aka 'basic_ostream<char>') has protected default constructor -
@Joel:这个问题不是关于创建一个
operator<<来流式传输用户定义的类型(根据您的重复候选者),而是关于创建一个可以流式传输其他类型的类型。它也可能是重复的,但更难找到。 -
问题是,你没有初始化
std::ostream。我不确定你可以创建一个普通的ostream——你通常要么创建一个ofstream要么创建一个ostringstream(也许现在称为ostrstream?我忘了。)尝试替换std::ostream和std::ostringstream。