2014-04-04 56 views
0

我想重載operator >>但我有一個很大的錯誤,當我嘗試編譯超載運營商的I/O probblem

std::istream& operator>>(std::istream & is) 
{ 
string str; 
is>>str; 
vector<Cord> v; 
cout<<str<<endl; 
bool test=testeur(str, v); 
if (test) 
{ 
    for (unsigned int i=0;i<v.size();i++) 
    table.push_back(v[i]); 
} 
return is; 
} 

我主:

istringstream tmp2 ("(0,0) > (0,1)"); 
tmp2 >> x1; 

我得到這個錯誤: TEST.CPP:473:9:錯誤:不對應的 '運營商>>' 在 'TMP2 >> X1' TEST.CPP:473:9:注:考生:

現在我嘗試這樣做:

friend std::istream& operator>>(std::istream & is, const CGPS & rhs) 
{ 
string str; 
is>>str; 
vector<CCoord> v; 
cout<<str<<endl; 
bool test=testeur(str, v); 
if (test) 
{ 
    for (unsigned int i=0;i<v.size();i++) 
    rhs. Add (v[i]); 
} 
return is; 
} 

,我得到這個錯誤:

test.cpp: In function ‘std::istream& operator>>(std::istream&, const CGPS&)’: test.cpp:448:29: error: cannot call member function ‘bool CGPS::testeur(std::string, std::vector&)’ without object test.cpp:452:23: error: no matching function for call to ‘CGPS::Add(CCoord&) const’ test.cpp:452:23: note: candidate is: test.cpp:106:12: note: CGPS& CGPS::Add(CCoord) test.cpp:106:12: note: no known conversion for implicit ‘this’ parameter from ‘const CGPS*’ to ‘CGPS*’

+0

我猜這是一個成員函數。它必須是一個自由函數,所以'std :: istream&'是第一個參數。 – chris

+0

謝謝。我不明白你的意思是什麼意思。 – bandera

+0

您現在正在嘗試從一個免費函數調用CGPS類的方法,而不提供實例。它應該是'bool test = rhs.testeur(str,v)',所以你可以在你的實例上調用該方法。另外,你將修改'rhs'實例,所以你應該傳遞一個非const引用給操作符。 – Useless

回答

1

>>經營者必須是一個免費的功能,因爲它的左手側是流。

所以,你需要實現

std::istream& operator>>(std::istream& is, YourClass& x); 

的語法調用你的實現是

x1 >> tmp2; 

看起來真的很奇怪。


附錄:

你讓你更新的代碼兩個錯誤:

  1. CGPS參數不能const(這是你正在閱讀到的對象,所以你正在修改它)。
  2. testeur顯然是CGPS的成員函數,所以你應該把它叫做rhs.testeur(str,v)
+0

是的,它必須是相反的東西:tmp2 >> x1; – bandera

0

運算符>>函數不能是類的成員函數,因爲第一個參數必須是istream而不是這個。

試試這個:

friend std::istream& operator>>(std::istream & is, MyClass & rhs) 
{ 
    input the data here (you have access to private data) 
    return is; 
} 

,或者如果你只需要MyClass的公共成員訪問您所需要的數據,你可以把它在同一個命名空間中一個獨立的免費功能。沒有「朋友」的聲明看起來是一樣的。它應該出現在類的聲明之外,並且您可能需要將其內聯。

澄清:你有(至少)三種選擇:

  • 申報(和定義)功能爲好友的功能。儘管定義出現在類聲明中,但它不是類成員,即使是 。
    • 有了這個選擇,您可以訪問班級中的私人數據。
  • 聲明(和定義)函數作爲內聯函數與類(以及相同的名稱空間)相同的頭文件中,但在類聲明外部,並且只使用公共方法來設置值讀取。
  • 將該函數聲明爲與該類相同的頭文件。在cpp文件中定義函數的主體。不同之處在於函數不是內聯的。

對於所有這些選擇,運算符>>函數是獨立的,而不是類的成員。

+0

我更新了代碼,但仍然有錯誤。你的意思是我必須在課堂之外實現這個功能嗎? – bandera

+0

如果將函數聲明爲朋友,即使聲明出現在類聲明中,它也不是該類的成員。 –

+0

我對MyClass的引用有一個「const」。這是一個錯誤,因爲這個函數需要改變myclass(我想運營商<<,而不是運營商>>) –