🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

1回答

907閲覧

std::vector<bool> がうまくいかない

wakasagi

総合スコア7

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2019/09/30 13:36

前提・実現したいこと

std::vector<bool> を使ってコードを書いているのですが、no matching function となってしまいうまく行きません。
std::vector<bool> は使うべきではないと聞いたので std::vector<char> にしたり、単純に bool などにしましたがだめでした。
他に試すべきことがあればご教授いただきたいです。

発生している問題・エラーメッセージ

Eigen::Matrix3d minimizeTransform 内 ceres::CostFunction* cost = new ceres::AutoDiffCostFunction<CostFunc, 1, 9>  (new CostFunc(source->at(i), target->at(closest[i]), weight[i])); 上記の一番最後のweight[i]に次のエラー no matching function for call to ‘CostFunc::CostFunc(pcl::PointXYZ&, pcl::PointXYZ&, std::vector<bool>::reference)’

該当のソースコード

C++

1struct CostFunc 2{ 3 CostFunc(const pcl::PointNormal source, const pcl::PointNormal target, const bool w) 4 : source_(source), target_(target), w_(w) {} 5 6 template <typename T> 7 bool operator()(const T *const p, T *residual, const bool w) 8 { 9 T x = T(source_.x); 10 T y = T(source_.y); 11 T z = T(source_.z); 12 13 pcl::PointXYZ Tb; 14 Tb.x = p[0]*x+p[1]*y+p[2]*z+p[3]; 15 Tb.y = p[4]*x+p[5]*y+p[6]*z+p[7]; 16 Tb.z = p[8]*x+p[9]*y+p[10]*z+p[11]; 17 18 residual[0] = T(w?1:0)*T(sqrt(pow( (target_.x - Tb.x)*(target_.x - Tb.x) + (target_.y - Tb.y) * (target_.y - Tb.y) + (target_.z - Tb.z) * (target_.z - Tb.z), 0.5 ))); 19 return true; 20 } 21 22 private: 23 pcl::PointNormal source_; 24 pcl::PointNormal target_; 25 double w_; 26}; 27std::vector<bool> &weight → bool weight 28Eigen::Matrix3d minimizeTransform( 29 pcl::PointCloud<pcl::PointXYZ>::Ptr source, 30 pcl::PointCloud<pcl::PointXYZ>::Ptr target, 31 std::vector<int> &closest, 32 std::vector<bool> &weight) 33{ 34 Eigen::Matrix3d matrix; 35 ceres::Problem problem; 36 std::vector<double> param(9, INITIAL_SURFACE_PARAMETER); 37 for (int i = 0; i < target->size(); ++i) 38 { 39 ceres::CostFunction* cost = 40 new ceres::AutoDiffCostFunction<CostFunc, 1, 9>(new CostFunc( 41 source->at(i), 42 target->at(closest[i]), 43 weight[i])); 44 problem.AddResidualBlock(cost, NULL, param.data()); 45 }

補足情報(FW/ツールのバージョンなど)

C++
Ceres Solver
Eigen
Point Cloud Library

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

std::vector<bool>云々ではなく、
source->at(i)target->at(closest[i])の型がコンストラクタの第1,第2引数の型と一致していないだけでは?


扱いたいデータがPointXYZであっているのであれば、
yohhoyさんのコメントにもあるように、以下のように修正すれば質問の箇所は通ると思います。

diff

1- CostFunc(const pcl::PointNormal source, const pcl::PointNormal target, const bool w) 2+ CostFunc(const pcl::PointXYZ source, const pcl::PointXYZ target, const bool w) 3- pcl::PointNormal source_; 4- pcl::PointNormal target_; 5+ pcl::PointXYZ source_; 6+ pcl::PointXYZ target_;

p[9]以降アクセスしていたり、w_boolではなくdoubleだったりと気になる点がありますが…
なにか元になるコードがあり、改造しているのでしょうか?

投稿2019/09/30 14:33

編集2019/10/01 14:12
SHOMI

総合スコア4079

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

wakasagi

2019/10/01 00:18

回答ありがとうございます 第一第二引数のことが頭から抜け落ちていたようです。 試してみます。
wakasagi

2019/10/01 04:16

いろいろ試してみましたが、どうしても引数の型が合いません。 この場合考えられる引数は何かわかりますでしょうか?
yohhoy

2019/10/01 08:00

実引数は pcl::PointXYZ 型なのに、CostFuncコンストラクタは pcl::PointNormal 型を要求していませんか。 ここから先はPCLのドメイン知識が必要ですが、簡単に検索した限りでは PointXYZ は座標情報のみ、PointNormal は座標情報+他の情報 から構成されるため、質問中のコードは異なる概念のものを同一に扱おうとしているようです。(単に実装上の問題なのか、設計が誤っているのかまではわかりません)
wakasagi

2019/10/03 08:36

yohhoyさん ありがとうございます。仰るとおりPointNormalとPointXYZが混在していました。 PointXYZに統一してみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問