1

次のコードは期待どおりに機能します。

void foo(auto const &){}

auto const rng{ranges::view::all(v)};
ranges::for_each(rng, [](auto const & r){
    foo(r);
});

ただし、次のとおりです。

void foo(auto const &){}

auto const rng{ranges::view::all(v)};
ranges::for_each(rng, &foo);

コンパイルエラーが発生します:

template argument deduction/substitution failed:
couldn't deduce template parameter 'F'

ソースを見てみましたが、正直なところ問題がわかりませんでした。

4

2 に答える 2

3

必要なオーバーロード/インスタンス化を明示的に指定せずに、オーバーロードされた関数またはテンプレート関数アドレス取得することはできません。

最初のスニペットのようにラムダ式を渡すと、この問題を解決できます。

または、 にアクセスできる場合は、それを関数オブジェクトfooに変換できます。

namespace detail
{
    struct foo_t
    {
        template <typename T>
        void operator()(const T&) const { /* ... */ }
    };
}

constexpr detail::foo_t foo{};

これにより、次のように記述できます。

ranges::for_each(rng, foo);
于 2017-03-31T13:04:01.307 に答える