コンパイラ:g ++ 4.4.3 ブースト...:1.49.0 OS ......:Ubuntu
注:C ++を真剣に使用してから15年が経ちました。そのため、Boostも学習しようとしているので、新しいことを再学習して学習しています。
次のコードが与えられます:
1. class Beta {
2. public:
3. std::string name();
4. }
5.
6. class Alpha {
7. public:
8. Beta m_beta;
9. }
10.
11. Alpha one;
さまざまな理由から、boost:bindを使用して、「one.m_beta.name()」が呼び出された場合と同じ結果を達成したいと思いました。私は次のことがそれをするだろうと思った:
12. boost::function<std::string(Alpha)>
13. b = boost::bind(
14. &Beta::name,
15. boost::bind(&Alpha::m_beta, _1)
16. );
17. cout << "NAME = " << b(one) << "\n";
しかし、コンパイルすると(Ubuntuではg ++ 4.4.3)、次のエラーが発生します。
エラー:「constBeta*」から「Beta*」への無効な変換</blockquote>13〜16行目からの実際の型定義を見ると、15行目が「constBeta *」になっているように見えますが、バインドの折り返しには「Beta*」が必要です。
ただし、これは機能します。
30. boost::function<std::string(Beta)> 31. p1 = boost::bind(&Beta::name,_1); 32. boost::function<Beta(Alpha)> 33. p2 = boost::bind(&Alpha::m_beta,_1); 34. std::cout << "NAME = " << p1(p2(one)) << "\n";
しかし、私は本当に多くの中間変数を持ち歩きたくありません。最初のバージョンも機能させる方法があるはずだと私は思いました。15行目の代わりに次のコマンドを試しましたが、コンパイル時にもエラーが発生します。
50. (boost::function<Beta&(Alpha)>)(boost::bind(&Alpha::m_beta,_1)) 51. (boost::function<Beta(Alpha)>)(boost::bind(&Alpha::m_beta,_1)) 52. (boost::function<Beta*(Alpha)>)(boost::bind(&Alpha::m_beta,_1)) 53. boost::protect(boost::bind(&Alpha::m_beta,_1)) 54. boost::ref(boost::bind(&Alpha::m_beta,_1)) 55. const_cast<Beta*>(boost::bind(&Alpha::m_beta,_1)) 56. const_cast<boost::function<Beta(Alpha) > >(boost::bind(&Alpha::m_beta,_1)) 57. const_cast<boost::function<Beta*(Alpha) > >(boost::bind(&Alpha::m_beta,_1))
私は何が欠けていますか?