2014-02-10 6 views
0

В моем классе InVal, у меня есть метод и оператор друг объявил, как показано ниже:Недопустимые аргументы в вызове метода

void Parse(std::istream& file) throw (int); 
friend std::istream& operator >> (std::istream& is, const InVal& id3); 

Друг оператор >> код заключается в следующем:

std::istream& operator >> (std::istream& is, const InVal& val) { 
    val.Parse(is); 
    return is; 
} 

На линии val.Parse(is) Я получаю Invalid arguments с предложением кандидата void Parse(std::basic_istream<char, std::char_traits<char>>&). В iosfwd, у меня есть

typedef basic_istream<char>   istream 

Так что где-то что-то не соответствует. Почему я получаю ошибку и как ее разрешить?

ответ

2

val является ссылкой const, что означает, что вы можете только называть const функциями-членами. Вы должны объявить Parse как функция в const члена так:

void Parse(std::istream& file) const throw (int); 

Это обещает компилятор, что Parse не будет изменять объект InVal он вызывается на время.

+0

Ах! Я все время укусаюсь этим. –

+0

Может быть, лучше сделать второй аргумент 'operator >>' non const? Я предполагаю, что в методе Parse вы каким-то образом загружаете содержимое InVal. –

+0

@PavelDavydov Да, это именно то, что я сделал. 'Const' пришел, потому что я сделал copy-paste из' << 'оператора, а затем изменил' ostream' на 'istream', но забыл удалить' const' из второго параметра. –

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