2012-01-06 92 views
0

好吧,我无法获得此代码的工作: 我想连接我的自定义操纵器。 所以他们将被称为cout << endl被称为。 比如我想这一点:超载操作员和编写操纵器?

emit << event1 << event2 << event3; 

这里是我的代码:

class Emit 
{ 
public: 
       // ... 
    const void operator<<(const Event& _event) const; 
}const emit; // note this global 

inline const void Emit::operator<<(const Event& _event) const 
{ 
    Start(_event); 
} 


class Event 
{ 
       // ... 
     const Event& Event::operator<<(const Event& _event) const; 
}; 

inline const Event& Event::operator<<(const Event& _event) const 
{ 
    return _event; 
} 

但是我不能称之为:

emit << event1 << event2 << event3; 

我eather收到编译时错误,链接时错误和我在代码中改变的东西我得到的答案错误没有成功。

例如这一个:

错误1个错误C2679:二进制“< <”:没有操作员发现这需要类型的 右边的操作数“const的EventHandling ::活动”(或有 没有可接受的转换)C:\用户\ ADMIN \文档\ Visual工作室 2010 \项目\ cppsystem \ eventhandling \ test.h 18个

非常感谢。

回答

2

这些操作员从左到右被调用。因此,在第一次调用(emit << event1)必须返回参考Emit

class Emit 
{ 
public: 
    // ... 
    Emit const& operator<<(const Event& _event) const; 
}const emit; // note this global 

Emit const& Emit::operator<<(const Event& _event) const 
{ 
    Start(_event); 
    return *this; 
} 

现在你不需要超载在Eventoperator<<了。

+0

ahahah:D我现在明白了,非常感谢Xeo,你刚刚救了我的键盘!你的代码就像一个魅力。 – codekiddy 2012-01-06 22:48:59

1

如果你的操纵器不包含任何数据,你实际上可以写一个函数。例如,std::endl实现大致是这样的(它需要应对宽流以及因而做了一些魔法来安排字符被转换):

std::ostream& endl(std::ostream& out) { 
    (out << '\n').flush(); 
    return out; 
} 

如果你的操纵有一些数据需要存储的在一个合适的对象数据,然后就创建该类正常输出操作,例如std::setw()可以这样来实现(再次,忽略流实际上是模板):

struct std::setw { 
    setw(int size): size_(size) {} 
    int size_; 
}; 
std::ostream& operator<< (std::ostream& out, std::setw const& object) { 
    out.width(object.size_); 
    return out; 
} 

您可以实现输出运营商一个成员,因为你不控制的左侧:这是流对象所在的位置。如果您正在执行std::ostream,则可以实现这些成员(实际上,某些输出操作员是std::ostream的成员的标准任务)。

+0

噢,非常感谢那些有价值的信息,投票+,但我已经接受Xeo的回答,因为他在minit中发布。再次感谢!! – codekiddy 2012-01-06 22:52:59