7

次のコードはコンパイルされません。コンパイラは、*for_each* の呼び出しに一致する関数がないと文句を言います。これはなぜですか?

#include <map>
#include <algorithm>

struct Element
{
    void flip() {}
};

void flip_all(std::map<Element*, Element*> input)
{
    struct FlipFunctor
    {
        void operator() (std::pair<Element* const, Element*>& item)
        {
            item.second->flip();
        }
    };

    std::for_each(input.begin(), input.end(), FlipFunctor());
}

struct FlipFunctorfunction の前に移動するflip_allと、コードがコンパイルされます。

完全なエラー メッセージ:

for_each(std::_Rb_tree_iterator<std::pair<Element* const, Element*> >, std::_Rb_tree_iterator<std::pair<Element* const, Element*> >, flip_all(std ::map<Element*, Element*, std::less<Element*>, std::allocator<std::pair<Element* const, Element*> > >)::FlipFunctor)'</p>

4

2 に答える 2

13

std::for_each関数テンプレートです。テンプレート パラメーターの 1 つが関数の引数の型です。

テンプレート引数としてローカル型を使用することはできません。これは、現在の言語の単なる制限です。C++ の次のリビジョンである C++0x では、この制限が削除されているため、ローカル型をテンプレート引数として使用できます。

Visual C++ 2010 では、テンプレート引数としてのローカル クラスの使用が既にサポートされています。他のコンパイラでのサポートは異なる場合があります。C++0x ラムダをサポートするコンパイラは、ローカル クラスをテンプレート引数として使用することもサポートすると思います (これは完全に真実ではないかもしれませんが、理にかなっています)。

于 2010-12-29T02:02:55.333 に答える
0

コードをコンパイルしようとすると、別のエラーが発生します。

エラー: 'flip_all(__gnu_debug_def::map, std::allocator > >)::FlipFunctor' はローカル タイプ 'flip_all(__gnu_debug_def::map, std::allocator > >)::FlipFunctor' を使用します

関数のローカル型 (ここでは FlipFunctor など) には内部リンケージがあり、テンプレート型には外部リンケージが必要であるため、これは実際に予想されることです。std::for_each の 3 番目のパラメーターはテンプレートであるため、関数ローカル型のものを渡すことはできません。

于 2010-12-29T02:00:29.783 に答える