編集:Mike Seymour のコメントに従って、それに応じて実装を置き換えoperator std::string () const;
て変更しました。operator char * () const;
これにより暗黙のキャストが可能になりますが、何らかの理由で、unsigned long int 演算子が char * 演算子よりも優先されます。クラス、std::string がある場合。私の CustomizedInt クラスは、私が望む機能をサポートするためにいくつかのものから継承する必要があるという予感があります。に関するマイクのコメントを詳しく説明してもらえstd::basic_string
ますか? 私はそれを正しく理解したかどうかわかりません。
私はこのコードを持っています:
#include <string>
#include <sstream>
#include <iostream>
class CustomizedInt
{
private:
int data;
public:
CustomizedInt() : data(123)
{
}
operator unsigned long int () const;
operator std::string () const;
};
CustomizedInt::operator unsigned long int () const
{
std::cout << "Called operator unsigned long int; ";
unsigned long int output;
output = (unsigned long int)data;
return output;
}
CustomizedInt::operator std::string () const
{
std::cout << "Called operator std::string; ";
std::stringstream ss;
ss << this->data;
return ss.str();
}
int main()
{
CustomizedInt x;
std::cout << x << std::endl;
return 0;
}
「Called operator unsigned long int; 123」を出力します。私の質問は次のとおりです。
- 演算子 unsigned long int を削除した後、x を明示的に std::string にキャストする必要があるのはなぜですか? 暗黙のキャスト演算子 (std::string) を直接呼び出さないのはなぜですか?
- どの暗黙的なキャストが許可され、どの優先順位が優先されるかを説明するドキュメントはありますか? 演算子 unsigned int を演算子 unsigned long int と共にこのクラスに追加すると、 << 演算子のあいまいさに関するコンパイラ エラーが発生するようです...
- また、そのような演算子を定義するのは適切ではないことはわかっていますが、関連する注意事項を完全に理解しているかどうかはわかりません。誰かそれらの概要を教えてください。パブリック メソッドの ToUnsignedLongInt と ToString を定義する方がよいのでしょうか。