2012-04-13 4 views
2

를 사용하여 << 연산자를 재정의 오류 : 구조체) 불행하게도내가 내에 포함되어 무엇을 인쇄하려면 다음 두 가지 방법을 작성해야하는 두 가지 방법

, 나는 말한다 컴파일 오류가 무엇입니까 [] â AEX에서 â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 
} ; 
+0

. http://msdn.microsoft.com/en-us/library/1z2f6c2k(v=vs.80).aspx – prelic

+0

제 생각에는 컴파일러가 0에서 줄을 긋을 것입니다. 그래서 여러분은 한 줄 씩 벗어났습니다. 줄의 첫 줄에 오류가 있습니다. 위의 "문제가 있습니다." 'expression'은'[] '연산자를 정의합니까? 구현을 보여줄 수 있습니까? – dasblinkenlight

+0

물론, 위의 편집을하겠습니다. – rfmas3

답변

3

봐에서 operator[] 테이크 오버로드하는 방법을 배우려면 - 당신은 tokens 배열을 참조 깜빡하고 표현 자체를 색인했습니다. 당연히 컴파일러는 []이 과부하가 아니기 때문에 불평을합니다.

이 작동합니다 : 당신은 '<<'연산자를 오버로드 할 수

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

오, 고마워! 그것은 그것을 고쳤다! – rfmas3

1

답변

당신은 유형 불일치가있는 한 실제로 다음 ex.tokens에서 저장해야합니다. 다음

tk = ex.tokens[i];

원래 대답이 operator<<에 문제가 될 것 같지하지

을 할 필요가있다. 오히려 귀하의 유형이 expression 인 경우 operator[]을 정의하지 않은 것으로 보입니다.

하기가 매우 가까운 Overloading subscripting

+0

나는이 프로젝트에 대한 struct 표현식을 포함하고있는 파일을 편집 할 수 없다. – rfmas3