1. ホーム
  2. c++

[解決済み] "ユーザー定義リテラル演算子が見つかりません"

2022-02-07 23:05:06

質問

CppCoreGuidelines Philosophyを読んでいて、理解できない例が出てきました。( https://github.com/isocpp/CppCoreGuidelines/blob/master/CppCoreGuidelines.md#S-philosophy )

codeexampleにはこうあります。

change_speed(double s);   // bad: what does s signify?
// ...
change_speed(2.3);

change_speed(Speed s);    // better: the meaning of s is specified
// ...
change_speed(2.3);        // error: no unit
change_speed(23m / 10s);  // meters per second

最後の行について質問です。ガイドラインでは、Speedをこのように定義することが推奨されていると思うのですが。

typedef int Speed;

が、例の最終行では、引数の一部として m と s を使っています。同じことをしても、quot;ユーザー定義リテラル演算子が見つかりません"というエラーが表示されるだけです。

これはどうすればいいのでしょうか?

どのように解決するのですか?

<ブロッククオート

最後の一行について質問です。ガイドラインではSpeedをこのように定義することが推奨されていると思うのですが、いかがでしょうか?

typedef int Speed;

いや、そうではない。 というようなことを期待しているようです。

class Speed {
    double value;
public:
    ....
}

class Distance {
     double value;
public:
     ...
};

class Time {
     double value;
public:
     ....
};

Speed operator /(Distance d, Time t);

と、距離と時間に関するユーザー定義のリテラル演算子のペアです。

Distance operator "" _m(double);

Time operator "" _s(double);

しかし、この例にはバグがあります。 そうであるべきです。

change_speed(23_m / 10_s);  // meters per second