【问题标题】:Overriding the << operator using two methods使用两种方法覆盖 << 运算符
【发布时间】:2012-04-25 10:27:19
【问题描述】:

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

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

不幸的是,我收到一个编译错误,上面写着:error: no match for âex[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
} ;

【问题讨论】:

  • 您可以重载&lt;&lt; 运算符。 msdn.microsoft.com/en-us/library/1z2f6c2k(v=vs.80).aspx
  • 我认为你的编译器从零开始编号,所以你偏离了一个:错误在你的“问题在这里”评论的第一行。 expression 是否定义了 [] 运算符?你能展示一下实现吗?
  • 没问题,我会在上面编辑它。

标签: c++ operators ostream overriding


【解决方案1】:

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

这应该可行:

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

【讨论】:

    【解决方案2】:

    补充详细信息后回答

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

    tk = ex.tokens[i];

    原答案

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

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

    【讨论】:

    • 我明白了...我不允许编辑包含此项目的结构表达式的文件
    猜你喜欢
    • 2015-03-13
    • 1970-01-01
    • 1970-01-01
    • 2019-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-18
    • 1970-01-01
    相关资源
    最近更新 更多