3

私は次のコードを持っています:

class Employee {
friend string FindAddr( list<Employee> lst,string name );
public:
Employee(const string& s){ cout << "Employee CTOR" << endl;}
bool operator==( Employee& e) {
    return e.name == name;
}
private:
string name;
string addr;
};


string FindAddr( list<Employee> lst, string name ) { 
string result = "";
for( list<Employee>::iterator itr = lst.begin(); itr != lst.end(); itr++ ) { 
    if ( *itr == name ) { // Problematic code
        return (*itr).addr;
    }
}
return result;
}

私が理解しているように、問題のある行if ( *itr == name )は次の手順に従う必要があります。

  1. operator==それがクラスにあることを認識しEmployeeます。
  2. オペレーターが作業できるように、からstring nameへの変換があるかどうかを把握しようとしています。Employee
  3. Employee(const string& s)オブジェクトのコンストラクターを暗黙的に呼び出し ますstring name
  4. に進みoperator==ます。

ただし、この行はコンパイル時に問題を引き起こします。

Invalid operands to binary expression ('Employee' and 'string' (aka 'basic_string<char>'))

コンストラクターを明示的に呼び出したとしても:

if ( *itr == Employee::Employee(name) )

同じエラーが発生します。

これは紛らわしいです。暗黙のコンストラクター呼び出しがいつ機能するか(および、コンストラクターを明示的に呼び出してもコードが機能しない理由)を理解するのに問題があります。

ありがとう!

4

2 に答える 2

7

ルールは次のとおりです。
一時は参照にのみバインドできますconst

==が機能するために述べたように、型
のオブジェクトnameは型std::stringに変換する必要がありEmployeeます。クラスの変換演算子はEmployeeこれを実現する必要があります。ただし、作成されたEmployeeオブジェクトは一時オブジェクトです。つまり、名前を必要とするほど長く存続しない名前のないオブジェクトです。このような名前のない一時オブジェクトは、非定数参照にバインドできません。[参照1]
したがって、必要なのはconstリファレンスです。

bool operator==(const Employee& e)
                ^^^^^^

[参照1]ルールの動機
:この特定のルールの動機は、C++の設計と進化の
セクション3.7でBajrneによって概説されています。

ただし、非定数参照を非l値で初期化できるようにすることで、重大な間違いを1つ犯しました。例えば:

void incr(int &rr) {r++;}    

void g()
{
    double ss = 1;
    incr(ss);    //note: double passed int expected
}

タイプの違いによりint&、渡されたものを参照できません。そのため、の値doubleで初期化されたintを保持するために一時が生成されました。ssしたがって、incr()一時的なものが変更され、結果は関数に反映されませんでした。

したがって、多くの場合、一時オブジェクトは関数呼び出しで無意識のうちに生成されますが、それらは最も期待されておらず、関数は一時オブジェクトで動作するのに対し、関数は渡された元のオブジェクトで動作すると(誤って)想定する可能性があります。したがって、簡単に記述できます。あることを想定し、別のことを行うコード。そのため、このような誤解を招きやすい状況を回避するために、ルールが導入されました。

于 2012-06-27T15:06:16.413 に答える
0

*itrを与えるので、を文字列Employeeと比較しています。Employeename

必要なのはif ( *itr.name == name )

Employeeそうすれば、リスト内のを検索している名前と比較することになります。

于 2012-06-27T15:02:37.380 に答える