[過去ログ] C++相談室 part164 (1002レス)
1-

このスレッドは過去ログ倉庫に格納されています。
次スレ検索 歴削→次スレ 栞削→次スレ 過去ログメニュー
239
(1): (ワッチョイ 515f-C6j3) 2023/06/18(日)21:45 ID:UCXMUPHB0(1) AAS
>>238 エラーメッセージ見ればたぶん分かる。
240: (ワッチョイ 8101-1tDD) 2023/06/18(日)21:48 ID:VwYqKwPk0(2/4) AAS
>>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
省2
241
(1): (ワッチョイ 9e81-L1I+) 2023/06/18(日)23:15 ID:w3/xAOT+0(1) AAS
ADLでoperator+が見つからないからかな?
struct Vector : std::array <double, 3> {};
みたいに定義したらいけるのでは
242
(1): (ワッチョイ 8101-1tDD) 2023/06/18(日)23:20 ID:VwYqKwPk0(3/4) AAS
>>241
>struct Vector : std::array <double, 3> {};
>みたいに定義したらいけるのでは
通りますね
どういうこと?
243
(1): (ワッチョイ 32fb-9xvA) 2023/06/18(日)23:24 ID:bX3uBTIT0(1/2) AAS
std::accumulateが14行目で定義したoperator+を見つけれてないのが原因っぽい。

std::accumulateの第4引数に
[](const Vector& v1, const Vector& v2){ return v1+v2;}
を追加してやるとコンパイルは通る。

14行目のoperator+をstd名前空間に入れてやれば動くにゃ動くけど色々マズいので(調査する分にはいいけど)最終的な解答にはならないかな
244
(1): (ワッチョイ 32fb-9xvA) 2023/06/18(日)23:29 ID:bX3uBTIT0(2/2) AAS
>>242
たぶんC++コンパイラはoperator+の候補を検索するときに
Vector( = std::array<double, 3>)と同じ名前空間にあるものしか検索しない

Vectorのクラス定義そのものがグローバル名前空間にあるなら14行目のoperator+を見つけられるけど、
今はVectorの正体はstd::array<...>なのでstd名前空間しか検索しないんだと思う
245
(1): (ワッチョイ 8101-1tDD) 2023/06/18(日)23:39 ID:VwYqKwPk0(4/4) AAS
>>243,244
なるほど解説頂きまして有難うございます
グローバルスコープはどっからでも見えて良さそうなものの
何でグローバルスコープの関数を探さないですかね?
246
(1): (ワッチョイ a901-UvLK) 2023/06/18(日)23:48 ID:EGGkT3O00(1) AAS
独自のメンバ変数を持たないのなら継承してしまうのも手ではある(ただしコンストラクタやarrayを受け取るキャスト用コンストラクタとか書く必要が出ると思うけど)
ただ、そもそもカスタマイズしたり自分の用途に本当に使いやすいものを作りたいなら、ちゃんと自分で全部書いた方がいいと思うよ
247
(1): (ワッチョイ b110-lSMs) 2023/06/19(月)00:42 ID:2lgIrH6A0(1) AAS
>>245
std::accumlateの定義内からだと、その下の方(ユーザーコード)で定義されてるoperator+は見えてないので、グローバル名前空間の探索では見つからない
248
(1): (ワッチョイ 8101-1tDD) 2023/06/19(月)00:52 ID:Q4g6N6uX0(1/3) AAS
>>247
std::accumlateが定義されているnumericをincludeする前に
以下のようにグローバルスコープにプロトタイプを置いても
同じようにoperator+が見えてないとエラーが出ます
using Vector = std::array <double, 3>;
Vector operator + (const Vector &lhs, const Vector &rhs);
#include <numeric>
249
(1): (ワッチョイ a901-UvLK) 2023/06/19(月)03:40 ID:RYn53SnN0(1/2) AAS
accumlateは関数テンプレートだから実体化される時点でoperator+が見えてりゃOKのはず
言われてる通りADLで対象外なのが問題
250
(1): (ワッチョイ 256b-trtU) 2023/06/19(月)05:38 ID:JAsvvATP0(1) AAS
>>237
(スマート)ポインタで持って要らなくなったら明示的にリリースする方法はあらゆるコンテナに対して使えるよね?笑
251
(1): (ワッチョイ f59c-Axrn) 2023/06/19(月)08:48 ID:KLBRX38t0(1) AAS
>>250
>>223
252: (ワッチョイ 8101-1tDD) 2023/06/19(月)09:20 ID:Q4g6N6uX0(2/3) AAS
>>249
有難うございます
グローバルスコープに定義した関数が見えないのは
どうしてなんでしょうかね?
それでは全然グローバルじゃないような気がするのですが
規格を決めるときに何か意図があったのでしょうかね?
253
(1): (ワッチョイ a901-UvLK) 2023/06/19(月)10:39 ID:RYn53SnN0(2/2) AAS
そもそもが名前空間内(よその演算子と混ざらないように)にある演算子オーバーロードを、外部からでも引数が合えば使えるように(std::operator+(a, b)とか書かないでいいように)するためのルールらしいから
外部の演算子見に行くのは目的に合わんのじゃね

std名前空間内のarrayに外部から勝手に動作を追加しようとしてるんだから、あまりよろしくないやり方しようとしてると考えた方がいい
(だから>>246のように書いた、継承したら一応arrayではなくちゃんとVectorクラスに対する演算子だから通る)
254: (ワッチョイ 8101-1tDD) 2023/06/19(月)11:53 ID:Q4g6N6uX0(3/3) AAS
>>253
>std名前空間内のarrayに外部から勝手に動作を追加しようとしてるんだから、
>あまりよろしくないやり方しようとしてると考えた方がいい
なるほど
たぶんこういう考え方なんでしょうね
255: (ワッチョイ 5efb-+wmN) 2023/06/19(月)12:20 ID:4PINPeBN0(1) AAS
つまりvector<int>を使いなさいということ
256: (ワッチョイ 7d9b-trtU) 2023/06/19(月)12:21 ID:wGtx/iKL0(1) AAS
>>251
安価ミス
257: (アウアウウー Sacd-9XmN) 2023/06/20(火)00:04 ID:YSi65ASja(1) AAS
実引数依存の名前探索、Argument-Dependent Lookup (ADL)は、
Koenig lookup とも言う

「Cプログラミングの落とし穴」の著者、
Koenigが、C++ に入れる事を推奨した

ADLを知っているなら、かなりのプロと言える
258: (ワッチョイ 8101-1tDD) 2023/06/20(火)00:18 ID:vGfe0Eju0(1/7) AAS
勉強になります
1-
あと 744 レスあります
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ AAサムネイル

ぬこの手 ぬこTOP 0.012s