2014-02-10 189 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

valconst的参考,这意味着您只能在其上调用const成员函数。需要声明Parse作为const成员函数,像这样:

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

此承诺,Parse不会修改它被调用的InVal对象的编译器。

+0

啊!我一直被这个咬伤。 –

+0

也许最好让'operator >>'non const的第二个参数?我假设在Parse方法中,你以某种方式加载InVal的内容。 –

+0

@PavelDavydov是的,这正是我所做的。 'const'出现是因为我从'<<'运算符复制粘贴,然后将'ostream'改为'istream',但忘记从第二个参数中删除'const'。 –