3

これは、ハーブサッターのgotw3(http://www.gotw.ca/gotw/003.htm)から派生しています。

次のクラスとFindAddr関数で...

using std::string;
using std::list;

class Employee
{
public:
    Employee(const string& n, const string& a) : name(n), addr(a) { }
    string name;
    string addr;
};

string FindAddr(const list<Employee>& l, const string& name)
{
    string addr;
    list<Employee>::const_iterator i = find(l.begin(), l.end(), name);

    if (i != l.end()) {
        addr = (*i).addr;
    }
    return addr;
} 

Employeeクラスには文字列への変換がないため、コンパイルエラーが発生します。このような変換は必ずしも賢明ではないことがわかりますが、演習の目的で、単純な変換を追加しました。

string::string(const Employee& e)
{
    return e.name;
}

これは私にエラーを与えます:

gotw3.cc:17:9: error: C++ requires a type specifier for all declarations
string::string(const Employee& e)
~~~~~~  ^

私は何が間違っているのですか?

4

2 に答える 2

13

2つ:まず、クラス定義を変更せずに既存のクラスに追加することはできません。std::string変換可能(または変換可能)にするクラスがある場合はdouble、変換演算子を定義する必要があります。

class Employee
{
    //  ...
    operator std::string() const
    {
        return name;  //  Or whatever...
    }
};

第二に、あなたの場合の解決策は、暗黙の変換を提供することではなくstd::find_if、適切なマッチャーで使用することです。C ++ 11では、これはラムダを使用して実行できますが、一般に(および、古いバージョンのC ++では)、いつでも関数型を定義できます。このような場合、クラスに自然な「キー」がある場合は、次の行に沿って、おそらくいくつかのメンバークラスを追加します。

class Match : std::unary_function<Employee, bool>
{
    std::string myName;
public:
    explicit Match( std::string const& name )
        : myName( name )
    {
    }
    bool operator()( Employee const& toBeMatched ) const
    {
        return toBeMatched.name == myName;
    }
};

順序関係、またはキーの同等性を定義する追加の機能タイプも同様に順序付けられる場合があります。

于 2012-12-13T14:03:23.690 に答える
3

クラス文字列はなく、クラステンプレートstd::basic_stringがあります。

std名前空間の内容は絶対に変更しないでください。

タイプを文字列に変換する目的で、追加できます

Employee::operator std::string()

または定義する

std::ostream& operator<<( const Employee& em, std::ostream& os );-このようにして、タイプはで機能しlexical_castます。

..しかし、ここで実際に必要なのはstd::find_if()

于 2012-12-13T14:01:10.860 に答える