0

カスタム コンパレータを使用して成分を並べ替えようとすると、このコンパイラ エラーが発生します。

kitchen.cpp: In member function ‘void Kitchen::printContents(std::ofstream&)’:
kitchen.cpp:172: error: no matching function for call to ‘std::list<Ingredient, std::allocator<Ingredient> >::sort(<unresolved overloaded function type>)’
/usr/include/c++/4.2.1/bits/list.tcc:271: note: candidates are: void std::list<_Tp, _Alloc>::sort() [with _Tp = Ingredient, _Alloc = std::allocator<Ingredient>]
/usr/include/c++/4.2.1/bits/list.tcc:348: note:                 void std::list<_Tp, _Alloc>::sort(_StrictWeakOrdering) [with _StrictWeakOrdering = bool (Kitchen::*)(const Ingredient&, const Ingredient&), _Tp = Ingredient, _Alloc = std::allocator<Ingredient>]

原因となっているコードは次のとおりです。

bool sortFunction(const Ingredient a, const Ingredient b)
{
    if (a.getQuantity() < b.getQuantity())
        return true;
    else if (a.getQuantity() == b.getQuantity())
    {
        if (a.getName() < b.getName()) return true;
        else return false;
    }
    else return false;
}

void Kitchen::printContents(std::ofstream &ostr)
{
    ostr << "In the kitchen: " << std::endl;

    ingredients.sort(sortFunction);

    std::list<Ingredient>::iterator itr;
    for (itr = ingredients.begin(); itr != ingredients.end(); ++itr)
    {
        ostr << std::setw(3) << std::right << itr->getQuantity() << " " 
        << itr->getName() << std::endl;

    }
}
4

4 に答える 4

3

上記のエラーの原因となる別のsortFunction場所 (たとえば、 ) がある可能性があります。Kitchen

試す

ingredients.sort(::sortFunction);

この質問に似ています。

また、適切なコーディングの実践のために、変更することをお勧めします

bool sortFunction(const Ingredient a, const Ingredient b)

bool sortFunction(const Ingredient &a, const Ingredient &b)

1 つ目はオブジェクトのコピーを渡し、2 つ目は参照を渡すだけです。

于 2013-02-28T18:22:11.373 に答える
2

Kicthen に sortFunction というメソッドがあり、コンパイラが適切なメソッドを選択できないようです。これを試すことができます:

list.sort( ::sortFunction );

それを解決するには、または提供した関数が Kitchen クラスのメソッドであると思われる場合は、それを修正する必要があります。

ところで:

if (a.getName() < b.getName()) return true;
else return false;

以下と同じです:

return a.getName() < b.getName();
于 2013-02-28T18:27:02.907 に答える
1

私の推測では、メンバー関数を宣言していると思いますKitchen::sortFunction。別のメンバー関数 ( などprintContents) 内では、使用する非メンバー関数が非表示になります。

エラーメッセージは、これが事実であることを示唆しています。sortメンバー関数型のインスタンス化を試みていますbool (Kitchen::*)(const Ingredient&, const Ingredient&)

メンバー関数が存在しないと想定されている場合は、宣言を削除してください。そうである場合は、いずれかの関数の名前を変更するか、非メンバー関数を として参照し::sortFunctionます。

于 2013-02-28T18:31:47.943 に答える
0

あなたのソート機能は次のとおりです。

bool sortFunction(const Ingredient a, const Ingredient b)

しかし、おそらく次のようになります。

bool sortFunction(const Ingredient &a, const Ingredient &b)

(参照に注意してください)

また、すでに述べたように、Kitchen クラスには既に sortFunction() という関数があり、それが優先されるため、::sortFunction() を使用するか、各関数に一意でわかりやすい名前を付けます。

Kitchen::sortFunction()必要な場合は、静的メンバー関数である必要があります。

于 2013-02-28T18:42:09.263 に答える