編集:Mike Seymourのコメントに続いて、operator std::string() const;
をoperator char *() const;
に置き換え、それに応じて実装を変更しました。これは暗黙的なキャストを可能にしますが、何らかの理由でunsigned long int演算子がchar *演算子よりも優先されます。ちょうどいい感じではありません...また、char *のような厄介なCのものを公開したくありませんクラス、私はstd :: stringを持っています。私は、私の望む機能をサポートするために、私のCustomizedIntクラスがいくつかのものから継承する必要があることに感心しています。誰でもstd::basic_string
に関するマイクのコメントを詳しく教えてもらえますか?私はそれを正しく理解しているか分からない。C++暗黙の変換演算子先行
私は、コードのこの部分があります: "演算子のunsigned long int型と呼ばれる; 123" プリント
#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;
}
を。私の質問は次のとおりです:
- 演算子unsigned long intを削除した後、xをstd :: stringに明示的にキャストする必要があるのはなぜですか?なぜ暗黙のキャスト演算子(std :: string)を直接呼び出さないのですか?
- どの暗黙のキャストが許可され、どの優先順位が優先されるかを説明するドキュメントはありますか?これは、演算子unsigned long intと演算子unsigned intを加算すると、< <演算子のコンパイラエラーが表示されるようです...
- また、このような演算子を定義することができます貧しい人々の練習ですが、私は関連する警告を十分に理解していません。誰かがそれらの概要を教えてもらえますか?パブリックメソッドToUnsignedLongIntとToStringを定義するほうがよいでしょうか?
これは関連しています:[文字列への暗黙的な変換によるオブジェクトのストリーミング時のオーバーロード解決の失敗](http://stackoverflow.com/questions/6677072/overload-resolution-failure-when-streaming-object-via-implicit-conversion -str) –
@Als:ゆっくりとしましょう...私はまだテンプレートに飛び込むつもりはありません:) –