2

私は次の状況に対処しています: テンプレート関数内で書式設定されたデータを抽出するために、istringstream の operator>> を使用しています。関数がスペースを持つ std::string で呼び出された場合を除いて、すべてがうまく機能します。例 std::string tmp("bla tmp"); 誰もが知っているように、演算子 >> (istringstream のメンバーではない) があり、istream と文字列を取り、スペースを区切り文字として使用してデータを抽出します。したがって、「bla tmp」ではなく、次の「bla」が表示されます。簡単に言うと、私は洗練されたものになるように努め、次のことを行いました。

class MyClass : public istringstream{
public:
      MyClass(const char* st) : istringstream(st){}
      void operator>>(string& st){st = this->str();}
}

しかし今、私はこの問題に直面しています:

MyClass my("bla tmp");
string tmp;
my >> tmp; // now tmp == "bla temp" and this is exactly what I wanted
//but this does not work
int kk;
my >> kk; //gives me "no match for operator>>"

どうしてですか?istringstream は基本型の operator>> を istream から継承し、I は istringstream を継承しています。しかし、独自の operator>> を実装し、その結果として istringstream を拡張することにより、MyClass は基本型の operator>> を失います。

4

1 に答える 1

2

どうしてですか?istringstream は基本型の operator>> を istream から継承し、I は istringstream を継承しています。

のオーバーロードは、基本クラスのものをoperator >> 隠します。using宣言を使用してoperator >>、基本クラスからのオーバーロードをオーバーロードの解決に参加させる必要があります。

class MyClass : public std::istringstream {
public:
    using std::istringstream::operator >>;
//  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    MyClass(const char* st) : std::istringstream(st){}
    void operator>>(std::string& st){st = this->str();}
};

名前の隠蔽の概念とそれがオーバーロードの解決にどのように干渉するかについては、Herb Sutter によるこの記事で説明されています (記事は主に仮想関数に関するものですが、直面している問題とまったく同じ問題について説明しています)。

最後に、上記の変更を加えてコンパイルしたコードの実際の例を次に示します。

于 2013-05-23T21:02:52.340 に答える