2014-04-04 2 views
0

Я пытаюсь перегрузить оператор >>, но у меня есть большая ошибка, когда я пытаюсь скомпилироватьперегрузка оператора 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', поэтому вам следует передать неконстантную ссылку на оператора. – 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, чтобы получить доступ к данным вам нужно, вы можете сделать это автономный свободной функции в том же пространстве имен. Декларация будет выглядеть одинаково без «друга». Он должен отображаться вне объявления класса, и вам, вероятно, нужно сделать его встроенным.

Разъяснения: У вас есть (по крайней мере) три варианта:

  • DECLARE (и определяют) функция как функция друга. Это не член класса даже , хотя определение появляется внутри объявления класса.
    • С помощью этого выбора у вас есть доступ к личным данным в классе.
  • Объявить (и определить) функцию как встроенную функцию в том же заголовочном файле, что и класс (и в том же пространстве имен), но вне объявления класса, и использовать только общедоступные методы в классе для установки значения считаны.
  • Объявите функцию в том же заголовочном файле, что и класс. Определите тело функции в файле cpp. Разница в том, что функция не является встроенной.

Для всех этих вариантов оператор >> функция является автономной, а не членом класса.

+0

Я обновил код, и все еще есть ошибка. Вы имеете в виду, что я должен реализовать эту функцию вне класса? – bandera

+0

Если вы объявляете функцию как друга, она не является членом класса, даже если объявление появляется внутри объявления класса. –

+0

У меня была «константа» по ссылке на MyClass. Это была ошибка, так как эта функция должна меняться myclass (я думал оператора <<, а не оператор >>) –

Смежные вопросы