来自第 2 周的大师。我们有原来的功能:
string FindAddr( list<Employee> l, string name )
{
for( list<Employee>::iterator i = l.begin(); // (1)
i != l.end();
i++ )
{
if( *i == name ) // (2)
{
return (*i).addr;
}
}
return "";
}
我向其中添加了虚拟 Employee 类:
class Employee
{
string n;
public:
string addr;
Employee(string name) : n(name) {}
Employee() {}
string name() const
{
return n;
}
operator string()
{
return n;
}
};
并得到编译错误:
到位(1):
conversion from ‘std::_List_const_iterator<Employee>’ to non-scalar type ‘std::_List_iterator<Employee>’ requested
到位(2):
no match for ‘operator==’ in ‘i.std::_List_iterator<_Tp>::operator* [with _Tp = Employee]() == name’
为了消除第一个,我们iterator
改为const_iterator
。消除第二个错误的唯一方法是编写自己的运算符==。然而,赫伯萨特写道:
Employee 类未显示,但要使其工作,它必须具有到 string 的转换或采用 string 的转换 ctor。
但是 Employee 有一个转换函数和转换构造函数。GCC 版本 4.4.3。正常编译,g++ file.cpp
没有任何标志。
应该有隐式转换,它应该工作,为什么不呢?我不想要 operator==,我只希望它像 Sutter 所说的那样工作,转换为 string 或转换 ctor 采用 string。