覆盖<<<运算符使用两种方法

时间:2012-04-13 02:02:24

标签: c++ operators ostream function-overriding

我必须编写这两种方法,以打印出其中包含的内容:

ex是一个由tokenType tk组成的数组(抱歉,试图节省空间并避免发布整个结构)

不幸的是,我收到一个编译错误,上面写着:错误:â] [i]中没有匹配âoperator[]â

如何解决这个问题,以便覆盖<<,以便第二种方法使用第一种方法?

ostream & operator<< ( ostream & os , const tokenType & tk)
{
    switch (tk.category)
    {
            case TKN_OPRAND:
            os << tk.operand;
            break;
            case TKN_OPRTOR:
            os << tk.symbol;
            break;              
    }
    return os;
}

ostream & operator<< ( ostream & os , const expression & ex)
{   
    tokenType tk;

    for (int i = 0; i < ex.numTokens; i++)
    {
        tk = ex[i];
        os << tk.operand << " ";  //problem line is this one
    }   
    return os;  
}

struct expression
{
    int numTokens ;
    tokenType tokens[MAX_TOKENS_IN_EXPRESSION] ;
    void print() const ;
    int  toPostfix( expression & pfx ) const ;
    int  evalPostfix( int & val ) ;
    expression() { numTokens = 0 ; } ;  // default constructor
} ;

2 个答案:

答案 0 :(得分:3)

你非常接近 - 你忘了引用tokens数组,并尝试索引表达式本身。当然,编译器抱怨,因为你没有[]重载。

这应该有效:

for (int i = 0; i < ex.numTokens; i++)
{
    tk = ex.tokens[i]; // <<==== Here is the fix
    os << tk.operand << " ";
}   

答案 1 :(得分:1)

在追加详情后回答

你需要从ex.tokens实际存储,因为存在类型不匹配。您需要执行以下操作

tk = ex.tokens[i];

原始答案

这似乎不是operator<<的问题。相反,您的类型expression似乎没有定义operator[]

要了解如何重载operator[],请查看Overloading subscripting