[過去ログ]
C++相談室 part164 (1002レス)
C++相談室 part164 http://mevius.5ch.net/test/read.cgi/tech/1683600652/
上
下
前
次
1-
新
通常表示
512バイト分割
レス栞
このスレッドは過去ログ倉庫に格納されています。
次スレ検索
歴削→次スレ
栞削→次スレ
過去ログメニュー
239: デフォルトの名無しさん (ワッチョイ 515f-C6j3) [sage] 2023/06/18(日) 21:45:44.90 ID:UCXMUPHB0 >>238 エラーメッセージ見ればたぶん分かる。 http://mevius.5ch.net/test/read.cgi/tech/1683600652/239
240: デフォルトの名無しさん (ワッチョイ 8101-1tDD) [sage] 2023/06/18(日) 21:48:16.43 ID:VwYqKwPk0 >>239 レス有難うございます まず訂正 -accumulate +std::accumulate 全部は貼れないですけど大事そうなところ In file included from /usr/include/c++/12/numeric:62, from test1.cpp:18: /usr/include/c++/12/bits/stl_numeric.h: In instantiation of ‘constexpr _Tp std::accumulate(_InputIterator, _InputIterator, _Tp) [with _InputIterator = _Deque_iterator<array<double, 3>, array<double, 3>&, array<double, 3>*>; _Tp = array<double, 3>]’: test1.cpp:22:14: required from here /usr/include/c++/12/bits/stl_numeric.h:141:46: error: no match for ‘operator+’ (operand types are ‘std::remove_reference<std::array<double, 3>&>::type’ {aka ‘std::array<double, 3>’} and ‘std::array<double, 3>’) 141 | __init = _GLIBCXX_MOVE_IF_20(__init) + *__first; http://mevius.5ch.net/test/read.cgi/tech/1683600652/240
241: デフォルトの名無しさん (ワッチョイ 9e81-L1I+) [sage] 2023/06/18(日) 23:15:51.41 ID:w3/xAOT+0 ADLでoperator+が見つからないからかな? struct Vector : std::array <double, 3> {}; みたいに定義したらいけるのでは http://mevius.5ch.net/test/read.cgi/tech/1683600652/241
242: デフォルトの名無しさん (ワッチョイ 8101-1tDD) [sage] 2023/06/18(日) 23:20:13.62 ID:VwYqKwPk0 >>241 >struct Vector : std::array <double, 3> {}; >みたいに定義したらいけるのでは 通りますね どういうこと? http://mevius.5ch.net/test/read.cgi/tech/1683600652/242
243: デフォルトの名無しさん (ワッチョイ 32fb-9xvA) [] 2023/06/18(日) 23:24:52.33 ID:bX3uBTIT0 std::accumulateが14行目で定義したoperator+を見つけれてないのが原因っぽい。 std::accumulateの第4引数に [](const Vector& v1, const Vector& v2){ return v1+v2;} を追加してやるとコンパイルは通る。 14行目のoperator+をstd名前空間に入れてやれば動くにゃ動くけど色々マズいので(調査する分にはいいけど)最終的な解答にはならないかな http://mevius.5ch.net/test/read.cgi/tech/1683600652/243
244: デフォルトの名無しさん (ワッチョイ 32fb-9xvA) [] 2023/06/18(日) 23:29:04.68 ID:bX3uBTIT0 >>242 たぶんC++コンパイラはoperator+の候補を検索するときに Vector( = std::array<double, 3>)と同じ名前空間にあるものしか検索しない Vectorのクラス定義そのものがグローバル名前空間にあるなら14行目のoperator+を見つけられるけど、 今はVectorの正体はstd::array<...>なのでstd名前空間しか検索しないんだと思う http://mevius.5ch.net/test/read.cgi/tech/1683600652/244
245: デフォルトの名無しさん (ワッチョイ 8101-1tDD) [sage] 2023/06/18(日) 23:39:19.50 ID:VwYqKwPk0 >>243,244 なるほど解説頂きまして有難うございます グローバルスコープはどっからでも見えて良さそうなものの 何でグローバルスコープの関数を探さないですかね? http://mevius.5ch.net/test/read.cgi/tech/1683600652/245
246: デフォルトの名無しさん (ワッチョイ a901-UvLK) [] 2023/06/18(日) 23:48:03.44 ID:EGGkT3O00 独自のメンバ変数を持たないのなら継承してしまうのも手ではある(ただしコンストラクタやarrayを受け取るキャスト用コンストラクタとか書く必要が出ると思うけど) ただ、そもそもカスタマイズしたり自分の用途に本当に使いやすいものを作りたいなら、ちゃんと自分で全部書いた方がいいと思うよ http://mevius.5ch.net/test/read.cgi/tech/1683600652/246
247: デフォルトの名無しさん (ワッチョイ b110-lSMs) [sage] 2023/06/19(月) 00:42:02.49 ID:2lgIrH6A0 >>245 std::accumlateの定義内からだと、その下の方(ユーザーコード)で定義されてるoperator+は見えてないので、グローバル名前空間の探索では見つからない http://mevius.5ch.net/test/read.cgi/tech/1683600652/247
248: デフォルトの名無しさん (ワッチョイ 8101-1tDD) [sage] 2023/06/19(月) 00:52:39.28 ID:Q4g6N6uX0 >>247 std::accumlateが定義されているnumericをincludeする前に 以下のようにグローバルスコープにプロトタイプを置いても 同じようにoperator+が見えてないとエラーが出ます using Vector = std::array <double, 3>; Vector operator + (const Vector &lhs, const Vector &rhs); #include <numeric> http://mevius.5ch.net/test/read.cgi/tech/1683600652/248
249: デフォルトの名無しさん (ワッチョイ a901-UvLK) [] 2023/06/19(月) 03:40:46.00 ID:RYn53SnN0 accumlateは関数テンプレートだから実体化される時点でoperator+が見えてりゃOKのはず 言われてる通りADLで対象外なのが問題 http://mevius.5ch.net/test/read.cgi/tech/1683600652/249
250: デフォルトの名無しさん (ワッチョイ 256b-trtU) [sage] 2023/06/19(月) 05:38:23.58 ID:JAsvvATP0 >>237 (スマート)ポインタで持って要らなくなったら明示的にリリースする方法はあらゆるコンテナに対して使えるよね?笑 http://mevius.5ch.net/test/read.cgi/tech/1683600652/250
251: デフォルトの名無しさん (ワッチョイ f59c-Axrn) [sage] 2023/06/19(月) 08:48:03.43 ID:KLBRX38t0 >>250 >>223 http://mevius.5ch.net/test/read.cgi/tech/1683600652/251
252: デフォルトの名無しさん (ワッチョイ 8101-1tDD) [sage] 2023/06/19(月) 09:20:16.57 ID:Q4g6N6uX0 >>249 有難うございます グローバルスコープに定義した関数が見えないのは どうしてなんでしょうかね? それでは全然グローバルじゃないような気がするのですが 規格を決めるときに何か意図があったのでしょうかね? http://mevius.5ch.net/test/read.cgi/tech/1683600652/252
253: デフォルトの名無しさん (ワッチョイ a901-UvLK) [] 2023/06/19(月) 10:39:37.41 ID:RYn53SnN0 そもそもが名前空間内(よその演算子と混ざらないように)にある演算子オーバーロードを、外部からでも引数が合えば使えるように(std::operator+(a, b)とか書かないでいいように)するためのルールらしいから 外部の演算子見に行くのは目的に合わんのじゃね std名前空間内のarrayに外部から勝手に動作を追加しようとしてるんだから、あまりよろしくないやり方しようとしてると考えた方がいい (だから>>246のように書いた、継承したら一応arrayではなくちゃんとVectorクラスに対する演算子だから通る) http://mevius.5ch.net/test/read.cgi/tech/1683600652/253
254: デフォルトの名無しさん (ワッチョイ 8101-1tDD) [sage] 2023/06/19(月) 11:53:54.08 ID:Q4g6N6uX0 >>253 >std名前空間内のarrayに外部から勝手に動作を追加しようとしてるんだから、 >あまりよろしくないやり方しようとしてると考えた方がいい なるほど たぶんこういう考え方なんでしょうね http://mevius.5ch.net/test/read.cgi/tech/1683600652/254
255: デフォルトの名無しさん (ワッチョイ 5efb-+wmN) [sage] 2023/06/19(月) 12:20:34.90 ID:4PINPeBN0 つまりvector<int>を使いなさいということ http://mevius.5ch.net/test/read.cgi/tech/1683600652/255
256: デフォルトの名無しさん (ワッチョイ 7d9b-trtU) [sage] 2023/06/19(月) 12:21:25.69 ID:wGtx/iKL0 >>251 安価ミス http://mevius.5ch.net/test/read.cgi/tech/1683600652/256
257: デフォルトの名無しさん (アウアウウー Sacd-9XmN) [sage] 2023/06/20(火) 00:04:57.81 ID:YSi65ASja 実引数依存の名前探索、Argument-Dependent Lookup (ADL)は、 Koenig lookup とも言う 「Cプログラミングの落とし穴」の著者、 Koenigが、C++ に入れる事を推奨した ADLを知っているなら、かなりのプロと言える http://mevius.5ch.net/test/read.cgi/tech/1683600652/257
258: デフォルトの名無しさん (ワッチョイ 8101-1tDD) [sage] 2023/06/20(火) 00:18:46.72 ID:vGfe0Eju0 勉強になります http://mevius.5ch.net/test/read.cgi/tech/1683600652/258
上
下
前
次
1-
新
書
関
写
板
覧
索
設
栞
歴
あと 744 レスあります
スレ情報
赤レス抽出
画像レス抽出
歴の未読スレ
AAサムネイル
Google検索
Wikipedia
ぬこの手
ぬこTOP
0.014s