質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
87.20%
Generics

Genericsはパラメトリックなポリモーフィズムの形態であり、.NET やJavaなど、様々な言語に実装されています。C++のテンプレートと同等の機能を持ち合わせています。

関数型プログラミング

関数型プログラミングとは、関数を用いて演算子を構築し、算出し、コンピュータプログラムを構成する枠組みです。

Rust

Rustは、MoFoが支援するプログラミング言語。高速性を維持しつつも、メモリ管理を安全に行うことが可能な言語です。同じコンパイル言語であるC言語やC++では困難だったマルチスレッドを実装しやすく、並行性という点においても優れています。

解決済

Rustでi32とu32を区別するためにUnsigedを型境界に使おうとするとconflictしてると怒られる

hidekiti
hidekiti

総合スコア23

Generics

Genericsはパラメトリックなポリモーフィズムの形態であり、.NET やJavaなど、様々な言語に実装されています。C++のテンプレートと同等の機能を持ち合わせています。

関数型プログラミング

関数型プログラミングとは、関数を用いて演算子を構築し、算出し、コンピュータプログラムを構成する枠組みです。

Rust

Rustは、MoFoが支援するプログラミング言語。高速性を維持しつつも、メモリ管理を安全に行うことが可能な言語です。同じコンパイル言語であるC言語やC++では困難だったマルチスレッドを実装しやすく、並行性という点においても優れています。

1回答

0評価

0クリップ

333閲覧

投稿2021/08/17 01:37

編集2021/08/19 14:27

やりたいこと

UnsigedなやつとSignedなやつで関数のふるまいを変えたい

ソースコード

rust

use std::{ops::Mul, process::Output}; use num::{Signed, Unsigned}; struct Sample<T>(T); // Unsigedなprimitive型に対する計算(負の場合を考慮しない) impl<T> Mul<u32> for Sample<T> { type Output = Self; fn mul(self, rhs: u32) -> Self::Output { todo!() } } // Signedなprimitive型に対する計算(負の場合も実装する) impl<S:Signed + 'static + Copy,T> Mul<S> for Sample<T> { type Output = Self; fn mul(self, rhs: S) -> Self::Output { todo!() } }

エラー

conflicting implementations of trait `std::ops::Mul<u32>` for type `Sample<_>` upstream crates may add a new impl of trait `num::Signed` for type `u32` in future versions

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

tatsuya6502

2021/08/17 10:24 編集

こんにちは。いまある情報だけですと、エラーの原因も解決方法もわかりません。 質問に以下の情報を追記していただけないでしょうか? - エラーメッセージ - Negトレイトの定義 - 何かクレートを使用しているなら、その情報。(AsPrimitive, WrappingMul, Unsignedトレイトはnum-traitsクレートのものを使っているのですか?) - もしAsPrimitive, WrappingMul, Unsignedトレイトは自分で定義したものなら、それらの定義
hidekiti

2021/08/17 15:00

コメントありがとうございます。 すべてのtraitはnum-traitsクレートのものを使ってます。 Unsigedはi32は実装することはなく、u32はSignedを実装することがないことが人間にはわかりますが、コンパイラはわからないので、型境界にUnsignedをつけた型TについてのMul<T>の実装と、i32についてのMul<i32>の実装がコンフリクトするんです。 これをうまくコンフリクトさせずに分けて実装できる、択一型(e.g. Unsignedを実装したらSignedは実装できないし、逆も成り立つ)みたいな型境界はないんですかね。ないとしたら符号付き整数型と符号なし整数型で実装を分けるにはすべての型について実装するしかないですかね。
退会済みユーザー

退会済みユーザー

2021/08/17 16:31 編集

まずは、tatsuya6502さんの質問にちゃんと応えましょう(念の為、回答者が偉いから従えとかいうことではなく、至極妥当な確認事項だからです). あと、u32にstd::ops::Negは実装されていないので、その2つの実装がコンフリクトするとは思えません.できれば、ソースコードもあまり省略せずに貼ってほしいです.塩梅が難しいかもしれませんが、不足しているよりは過剰な方が回答しやすいです.
hidekiti

2021/08/19 14:16

上のソースコードは変更してしまって手元になくなってしまいました。ごめんなさい。 ご指摘にのようにu32はNegを現状実装していませんが、コンパイラはu32がいつかNegを実装するかもしれないから潜在的にconflictしてるよと怒ってきます。これに対処する方法をご存じないですか?
hidekiti

2021/08/19 14:34

tsutuya6502さんのご指摘のようにSignedなものとUnsigedなものの区別は型境界ではできなさそうなので、実装単位を分けることで対処しようかなと思います。
退会済みユーザー

退会済みユーザー

2021/08/19 16:45 編集

潜在的なconflictという概念があるんですね.それは知らなかったので、勉強になりました. unstableな機能としては、negative implsというのがありますが、unstableなので、nightlyでないとコンパイルできなくなりますし、あまりおすすめはしません. https://doc.rust-lang.org/beta/unstable-book/language-features/negative-impls.html

まだ回答がついていません

会員登録して回答してみよう

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

同じタグがついた質問を見る

Generics

Genericsはパラメトリックなポリモーフィズムの形態であり、.NET やJavaなど、様々な言語に実装されています。C++のテンプレートと同等の機能を持ち合わせています。

関数型プログラミング

関数型プログラミングとは、関数を用いて演算子を構築し、算出し、コンピュータプログラムを構成する枠組みです。

Rust

Rustは、MoFoが支援するプログラミング言語。高速性を維持しつつも、メモリ管理を安全に行うことが可能な言語です。同じコンパイル言語であるC言語やC++では困難だったマルチスレッドを実装しやすく、並行性という点においても優れています。