2013-04-27 2 views
0

">>"를 stringstream과 함께 사용하면 어디에서나 오류가 발생합니다. 다른 형식이 아닌 AbsClass으로 작업하려면 >> 오버로드 만했기 때문에이 오류가 발생하는 이유는 알 수 없습니다.둘 이상의 연산자 ">>"는이 피연산자와 일치합니다

#include "Queue.h" 
#include "AbsClass.h" 
#include <fstream> 
#include <iostream> 
#include <iomanip> 
#include <sstream> 

using namespace std; 


int main() 
{ 
    ifstream read; 
    try 
    { 
     read.open("TopicGin.txt"); 
     if (!read) 
     throw QueueException(); 
    } 
    catch (QueueException&) 
    { 
     cerr << "Could not find input file.\n"; 
     char endchar = getchar(); 

     if(endchar == '\nn') 
     return 0; 
    } 

    string line; 

    getline(read, line); 

    stringstream stream; 

    stream << line; 

    int buffer; 

    Queue <int> q1; 

    while (stream >> buffer) 
    { 
     q1.enqueue(buffer); 
     cout << buffer << ' '; 
     cout << "count is "; 
     q1.displayCount(); 

    } 

    cout << q1.peek(); 

    q1.dequeue(); 

    cout << q1.peek(); 

    Queue<int> q2 = q1; 

    q2.peek(); 

    cout << "\n The contents of q2 with queue size " << q2.getSize() << " are: \n"; 
    q2.displayArray(); 

    //NEED EXCEPTIONS FOR THIS PART JUST SEETING UP 
    cout << " Attempt to create a queue of int with an invalid size.\n"; 

    Queue<int> q3(-1); 

    cout << "Create queue object of double q4 with a size of 14.\n"; 

    Queue<double> q4(14); 

    cout << "Read in values from the input file. \n"; 

    stream.clear(); 

    double dBuf; 

    getline (read, line); 

    stream << line; 

    while (stream >> dBuf) 
    { 
     q4.enqueue(dBuf); 
     cout << dBuf << ' '; 
     cout << "count is "; 
     q4.displayCount(); 

    } 

    cout << fixed << setprecision(2); 
    cout << q4.peek(); 
    q4.dequeue(); 
    cout << q4.peek(); 

    cout << "Create Queue object of 5 which is a copy of q4\n"; 

    Queue<double> q5 = q4; 

    q5.peek(); 

    q5.displayArray(); 


    //EXCEPTIONS AGAIN DLFKJALDKAJ 

    cout << "Attempt to peek an empty queue. \n"; 
    Queue<double> q6; 
    q6.peek(); 


    cout << "Create Queue object of AbsClass q7 with default size. \n"; 
    cout << "Read in values from input file \n"; 

    Queue<AbsClass> q7; 

    cout << "Read in values from the input file. \n"; 

    AbsClass AbsBuf; 

    getline (read, line); 

    stream.clear(); 

    stream << line; 

    while (stream >> AbsBuf) 
    { 
     q7.enqueue(AbsBuf); 
     cout << AbsBuf << ' '; 
     cout << "count is "; 
     q7.displayCount(); 0 
    } 
    return 0; 
} 

리터

#include<iostream> 
#include<cmath> 
#include <string> 
// JAMES: ADDED THIS: 
#include <sstream> 

using namespace std; 

// JAMES: ADDED THIS: 
stringstream& operator>>(stringstream& stream, AbsClass& obj); 

class AbsClass 
{ 
public: 
    AbsClass(int val = 0){num = abs(val);} // Inlined constructor 

    int getNum()const {return num;} 

    // JAMES: ADDED THIS: 
    void setNum(int newNum) { num = abs(newNum); } 

private: 
    int num; 
}; 

// JAMES: ADDED THIS: 
stringstream& operator>>(stringstream& stream, AbsClass& obj) 
{ 
    int buffer; 
    stream >> buffer; 

    obj.setNum(buffer); 

    return stream; 
} 

K

#include "AbsClass.h" 
#include <sstream> 

using namespace std; 


// JAMES: ADDED THIS: 
istream& operator>>(istream& stream, AbsClass& obj); 

istream& operator>>(istream& stream, AbsClass& obj) 
{ 
    int buffer; 
    stream >> buffer; 
    obj.setNum(buffer); 
    return stream; 
} 
+0

일반적으로 'std :: istream &'에 오버로드됩니다. – chris

답변

0

헤더 가드와 별도로 operator>>inline을 구현하거나 .cpp로 구현을 이동해야합니다. 그렇지 않으면 여러 정의 된 심볼 링크 오류가 발생합니다.
도 없음 use namespaces in headers

+0

왜 링크 오류가 발생합니까? – JamesGold

+0

헤더를 포함하는 각 .cpp는 자신의 연산자를 정의합니다 >> breaking [ODR] (http://stackoverflow.com/questions/4192170/what-exactly-is-one-definition-rule-in-c) – alexrider

+0

AbsClass.cpp에 'operator >>'를 넣으면, 메인 cpp 파일에 'no operator ">>"와 일치하는 피연산자가 있습니다.' AbsClass.cpp를 편집했습니다. – JamesGold

0

변경이

// JAMES: ADDED THIS: 
stringstream& operator>>(stringstream& stream, AbsClass& obj) 
{ 
    int buffer; 
    stream >> buffer; 

    obj.setNum(buffer); 

    return stream; 
} 

istream 용 문자열 스트림에 연산자 >>를 오버로드하지 마십시오. 그런 다음 stringstream을 포함한 모든 입력 스트림에서 작동합니다. 그것이 문제의 원인인지는 확실하지 않지만 확실히해야 할 일은 확실합니다.

+0

그러나 stringstreams와 함께 작동 시키길 원합니다. – JamesGold

+0

문자열 스트림에서도 작동합니다. 'istream'을 오버로드하면 ** 입력 스트림 인'cin','ifstream','fstream','istringstream','stringstream' 모두를위한 것입니다. – john

+0

알겠습니다. 그것을 istream로 바꿨지 만 문제는 계속됩니다. – JamesGold

0

AbsClass에 헤더 가드를 추가하는 것을 잊었습니다. 그것은 그것을 고쳤다.

+0

예. 막 말하려고했지만, 연산자 >> inline을 선언해야합니다. 헤더 파일에 있습니다. 'inline istream & operator >> (istream & stream, AbsClass & obj) {...'당신이 인라인으로 선언하지 않는다면, '정의 된 심볼을 여러 번'링커 오류가 발생할 가능성이 있습니다. – john

관련 문제