今週の達人 #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
ます。2 番目のエラーを解消する唯一の方法は、独自の operator== を記述することです。しかし、ハーブ・サッターは次のように書いています。
Employee クラスは示されていませんが、これが機能するには、文字列への変換または文字列を受け取る変換 ctor が必要です。
しかし、Employee には変換関数と変換コンストラクタがあります。GCC バージョン 4.4.3。g++ file.cpp
フラグなしで正常にコンパイルされました。
暗黙的な変換が必要であり、機能するはずですが、なぜ機能しないのですか? operator== は必要ありません。Sutter が言ったように、 string への変換または string を取る変換 ctor を使用して動作させたいだけです。