5

(boost / Algorithm / stringライブラリから)と一緒にstd::find_if使用して述語を作成しようとしています。次のスニペットは、私がこれを達成しようとしている2つの方法を示しています。boost::bindboost::contains

#include <boost/algorithm/string.hpp>
#include <boost/bind.hpp>
#include <boost/function.hpp>

#include <iostream>
#include <string>

int main(int argc, char** argv) {
        std::string s1("hello mom");
        std::string s2("bye mom");

        boost::function<bool (std::string, std::string)> f = &boost::contains<std::string, std::string>;
        std::cout << s1 << " contains " << "hello, " << std::boolalpha << f(s1, "hello") << std::endl;
        std::cout << s2 << " contains " << "hello, " << std::boolalpha << f(s2, "hello") << std::endl;

        boost::function<bool (std::string)> contain_hello = boost::bind(boost::contains<std::string, std::string>, _1, std::string("hello"));
        std::cout << s1 << " contains " << "hello, " << std::boolalpha << contain_hello(s1) << std::endl;
        std::cout << s2 << " contains " << "hello, " << std::boolalpha << contain_hello(s2) << std::endl;
        return EXIT_SUCCESS;
}

このコードをg++3.4.5でコンパイルすると、次の出力が得られます。

error: conversion from `<unresolved overloaded function type>' to non-scalar type `boost::function<bool ()(std::string, std::string), std::allocator<void> >' requested
error: no matching function for call to `bind(<unresolved overloaded function type>, boost::arg<1>&, std::string)'

boost::icontainsオーバーロードが1つしかないものに切り替えると、すべてが正常に機能します。非テンプレート関数のオーバーロードが複数ある場合に、同様の状況を解決する方法を知っています。誰かが私がこれを正しく書くのを手伝ってもらえますか?または、独自の比較関数を作成する必要がありますか?

4

2 に答える 2

8

static_cast<bool(*)(const std::string&, const std::string&)>(&boost::contains<..>)あなたは過負荷を解決するために書く必要があります。

はい、これはテンプレートとオーバーロードに伴う王室の苦痛です。OOPとオーバーロードを念頭に置いて作成されたライブラリは、テンプレートとboost::bindで使用するのは困難です。

私たちは皆、C ++ 0xラムダ式を待ちます。これにより、問題がより適切に解決されるはずです。

于 2010-02-24T14:32:54.967 に答える
0

そのコードは私には問題なく(正しく+準拠している)見え、Visual Studio 2008(Microsoft言語拡張機能が無効になっている)を使用してコンパイルされます。

より最新バージョンのgccを使用してみてください。

于 2010-02-24T14:26:07.477 に答える