[過去ログ]
C++相談室 part164 (1002レス)
C++相談室 part164 http://mevius.5ch.net/test/read.cgi/tech/1683600652/
上
下
前
次
1-
新
通常表示
512バイト分割
レス栞
このスレッドは過去ログ倉庫に格納されています。
次スレ検索
歴削→次スレ
栞削→次スレ
過去ログメニュー
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
259: デフォルトの名無しさん (アウアウウー Sacd-9XmN) [sage] 2023/06/20(火) 02:12:24.83 ID:1vctBLGTa 演算子のオーバーロードなら、フレンド関数とか? 非メンバの演算子オーバーロード | Programming Place Plus C++編【言語解説】 第35章 https://programming-place.net/ppp/contents/cpp/language/035.html http://mevius.5ch.net/test/read.cgi/tech/1683600652/259
260: はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 0d3e-C6j3) [sage] 2023/06/20(火) 10:05:39.77 ID:IIzrqfbq0 状況を簡略化するとこう。 namespace ns { struct foo {}; template <class T> void bar(const T&) { T() + T(); } }; ns::foo operator+(const ns::foo& x, const ns::foo& y) { return ns::foo(); } int main() { bar(ns::foo()); } ADL は「通常の探索に加えて」関連する名前空間も探索対象にするルールなのでグローバル名前空間も探索対象になるが、通常の探索では後ろで宣言 (定義) されているものは見つけることができない。 この場合はエラーとして検出されるけど、可視な宣言と実際の定義の集合に食い違いは未定義という解釈でいいと思う。 (ちょっと自信はない……。) だから順序を変えれば通る。 namespace ns { struct foo{}; }; ns::foo operator+(const ns::foo& x, const ns::foo& y) { return ns::foo(); } namespace ns { template <class T> void bar(const T&) { T() + T(); } }; int main() { bar(ns::foo()); } 当然ながら std の (というかそれに限らず既存のライブラリの) 宣言の順序をどうこうするわけにもいかないので無理にカスタムしようとするのは筋が悪いということになる。 http://mevius.5ch.net/test/read.cgi/tech/1683600652/260
261: デフォルトの名無しさん (ワッチョイ 8101-1tDD) [sage] 2023/06/20(火) 10:53:08.18 ID:vGfe0Eju0 >>260 >だから順序を変えれば通る。 最近手元のg++を更新しまして10.2.1 -> 12.2.0になったんですが 前者のケースが通らなくなりまして疑問に思っていたところでした 10.2.1は寛容で両方とも通るけどC++的には後者のみ通るのが正しい? http://mevius.5ch.net/test/read.cgi/tech/1683600652/261
262: はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 0d3e-C6j3) [sage] 2023/06/20(火) 11:41:30.21 ID:IIzrqfbq0 >>261 前者はたぶん未定義かつ診断不要な状況なのでエラーを検出せずに通すのも正しい挙動で プログラマがそういう状況を作ってしまうのが仕様に反する (というか結果が保証されない) という解釈になると思う。 http://mevius.5ch.net/test/read.cgi/tech/1683600652/262
263: デフォルトの名無しさん (ワッチョイ 8101-1tDD) [sage] 2023/06/20(火) 13:36:04.44 ID:vGfe0Eju0 なるほどー 有難うございます http://mevius.5ch.net/test/read.cgi/tech/1683600652/263
264: デフォルトの名無しさん (JP 0H91-FhUT) [] 2023/06/20(火) 21:39:35.82 ID:Pk8V/jejH template<typename Callback> void func(Callback cb) { //cb(1); // A //cb(1,2);// B } void f1(int){} void f2(int,int){} int main(){func(f1);} AとBをコンパイル時に呼び分けたいんですけど どのように記述すればよいか教えていただけませんか? http://mevius.5ch.net/test/read.cgi/tech/1683600652/264
265: デフォルトの名無しさん (ワッチョイ 515f-9XmN) [sage] 2023/06/20(火) 22:18:37.18 ID:Cuq1USIJ0 is_invocableでおk http://mevius.5ch.net/test/read.cgi/tech/1683600652/265
266: はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 0d3e-C6j3) [sage] 2023/06/20(火) 22:21:49.81 ID:IIzrqfbq0 >>264 渡されたコールバック関数の引数の数によって区別するってこと? 素朴な方法だとオーバーロードするのが手っ取り早いと思う。 void func(void (*cb)(int)) { cb(1); } void func(void (*cb)(int, int)) { cb(1, 2); } void f1(int) {} void f2(int, int) {} int main() { func(f1); func(f2); } http://mevius.5ch.net/test/read.cgi/tech/1683600652/266
267: デフォルトの名無しさん (ワッチョイ 8101-1tDD) [sage] 2023/06/20(火) 22:27:55.14 ID:vGfe0Eju0 >>264 template<typename Callback> void func(Callback cb); template <> void func(void (*cb) (int)) { (*cb)(1); // A } template <> void func(void (*cb) (int, int)) { (*cb)(1,2);// B } void f1(int){} void f2(int,int){} int main(){func(f1);} http://mevius.5ch.net/test/read.cgi/tech/1683600652/267
上
下
前
次
1-
新
書
関
写
板
覧
索
設
栞
歴
あと 735 レスあります
スレ情報
赤レス抽出
画像レス抽出
歴の未読スレ
AAサムネイル
Google検索
Wikipedia
ぬこの手
ぬこTOP
1.412s*