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

このスレッドは過去ログ倉庫に格納されています。
次スレ検索 歴削→次スレ 栞削→次スレ 過去ログメニュー
232: (テテンテンテン MM96-Axrn) 2023/06/17(土)19:22 ID:mYwWSuEFM(1) AAS
>>231
巨大インスタンスは>227
233: (ワッチョイ d9ab-trtU) 2023/06/17(土)19:29 ID:HtrmHz3i0(1) AAS
回答者のレベル低いな~~~
こんだけダラダラ続けて、結局質問者>>182>>190で早々に結論づけてることをリピートしてるだけw
234: (ワッチョイ 69f0-J7ro) 2023/06/17(土)19:54 ID:9hSxsWrs0(1) AAS
アロケータ気に入らないなら自作くらいしろよポンコツ
なにもかもSTLに頼りやがってそれでPGやってるつもりになるなよ
235: (ワッチョイ 6128-l8k0) 2023/06/17(土)20:19 ID:S+64vkUJ0(4/4) AAS
人類には早すぎた話題また……
236: (オイコラミネオ MM91-L1I+) 2023/06/17(土)23:14 ID:H9lc23A5M(1) AAS
次世代の人は便利に使いこなしてるかより簡素になった仕組みを使うのだろう
237
(1): (ワッチョイ 655f-rdTE) 2023/06/18(日)03:00 ID:GIMFAM+a0(1) AAS
>>231
コンテナの種類を問わない一般的な方法なんてものはないからじゃないですかね
238
(1): (ワッチョイ 8101-1tDD) 2023/06/18(日)21:04 ID:VwYqKwPk0(1/4) AAS
以下のコードでaccumulateのとこでコンパイルエラーが起こります
何故か分かります?
#include <iostream>
#include <array>
#include <deque>
#include <exception>
#include <numeric>
using Vector = std::array <double, 3>;
using Vector_Container = std::deque <Vector>;
Vector &operator += (Vector &lhs, const Vector &rhs) {
省16
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
1-
あと 751 レスあります
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ AAサムネイル

ぬこの手 ぬこTOP 0.011s