@egtraイグトランスの頭の中(のかけら)ActiveBasicを中心にプログラミングの話をぼちぼちと。new演算子.コメントなし今日はこんな話です。boost::in_placeを使ってみようとした。エラーになる例に遭遇。Boost側を直せばいい(そのためには、こんなの誰が知っているんだという::new構文の出番)この前、Gdiplusを使っていたプログラムでちょうどin_placeとoptionalの組み合わせが使えそうだと気付きました。まとめ「N3059」が世に公表されるなどという時流だったわけです。ところが、ダメでした。謎のエラーになるのです。そのときは原因追及を諦めてboost::scoped_ptrで我慢しました。こんなコードで同じエラーを見られます。constとfloatを引数に取るコンストラクタを持っている。constとfloatを引数に取るコンストラクタを持っている。}余談ですが、この引数で呼ばれるGdiplus::Fontコンストラクタにはデフォルト引数があるので、実際の引数の個数はもっと多いです。#ifの条件の値を0にする、すなわち自作Fontクラスにするとエラー無くin_placeが使用可能です。この自作Fontクラスはin_placeが利用可能で、Gdiplus::Fontはだめだったのでしょうか?その答えはnew演算子の多重定義です。Gdiplus::Fontの基底クラスを辿ると、GdiplusBaseクラスが親にあります。newの邪魔をしてしまうのです。in_place内部では、インスタンスの作成のために<new>にあるnewの多重定義の1つを呼びます。1.43.0ではboost/utility/in_place_factory.hppの50行目からその処理があります。}(BOOST_PP_ENUM_PARAMSはここでは無視しましょう)このnewは<new>で定義されている先ほど紹介した多重定義の1つを呼ぶことを意図しているはずです。newが見つかりません。newが存在しないことを原因とするエラーが生成されるのです。解決策はapplyに修正を加えることです(GdiplusBaseをいじる方法もありますが割愛します)。);たったこれだけです。これでGdiplus::Fontでもなんでも大丈夫です。C++標準には、newやdelete演算子に::を前置する構文があります。newやdeleteを呼ぶ意味になります。普段使う::なしのnewやdeleteだと、newするクラスを起点として名前探索が行われます。hoge::newのような任意の名前空間を指定する構文はありません。あとは、こう修正してくれと働きかけるだけです。......、すみませんまだやっていません。コメントをキャンセルメールアドレスが公開されることはありません。WPThemes.Info。