2018-12-27に投稿

ユーザー定義型 * Tは実装できるがT * ユーザー定義型は実装できない

ユーザー定義型 * Tは実装できるがT * ユーザー定義型は実装できない

任意の型の要素を持つVector1<T>を定義してT * Tが可能であればVector1<T> * TT * Vector1<T>ができるようにしたいとします。

struct Vector1<T> {
    x: T
}
// T * Tが可能であれば
// Vector1<T> * Tと
// T * Vector1<T>を可能にしたい

しかしVector1<T> * Tは実装できるのですがT * Vector1<T>は実装できません。

とりあえず実装してみる

use std::ops;

struct Vector1<T> {
    x: T,
}

impl<T> ops::Mul<T> for Vector1<T>
where
    T: ops::Mul<T, Output = T>,
{
    type Output = Vector1<T>;

    fn mul(self, rhs: T) -> Vector1<T> {
        Vector1 { x: self.x * rhs }
    }
}

impl<T> ops::Mul<Vector1<T>> for T
where
    T: ops::Mul<T, Output = T>,
{
    type Output = Vector1<T>;

    fn mul(self, rhs: Vector1<T>) -> Vector1<T> {
        Vector1 { x: self * rhs.x }
    }
}

fn main() {}

エラーが出ました。

   |
18 | / impl<T> ops::Mul<Vector1<T>> for T
19 | | where
20 | |     T: ops::Mul<T, Output = T>,
21 | | {
...  |
26 | |     }
27 | | }
   | |_^ type parameter `T` must be used as the type parameter for some local type
   |
   = note: only traits defined in the current crate can be implemented for a type parameter

Rust Playgroundでエラーを確認できます。
https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=7d83e5369d7c227e28e27f408d7d45b7


block

京都のゲームプログラマ。 C++/Rust/Game/Programmer/立方体

Crieitは個人で開発中です。 興味がある方は是非記事の投稿をお願いします! どんな軽い内容でも嬉しいです。
なぜCrieitを作ろうと思ったか

また、「こんな記事が読みたいけど見つからない!」という方は是非記事投稿リクエストボードへ!

こじんまりと作業ログやメモ、進捗を書き残しておきたい方はボード機能をご利用ください!

ボードとは?

関連記事

コメント