2

思考実験のビット...成分1:ostreamから派生したオブジェクトへのポインターを受け取る関数を持つ(プリコンパイルされた)共有ライブラリ内のクラス:

void ClassName::SetDefaultStream(std::ostream *stream)

成分2:

std :: ostreamから派生した私自身のクラス、いくつかの一般的なテンプレート化されたストリーム演算子:

class MyStream : public std::ostream
{
   public:
      template <typename T> MyStream &operator<<(const T &data)
      {
         std::cout << data;
         return *this;
      }
}

ここで、このクラスのインスタンス化のアドレスをSetDefaultStreamメソッドに渡すと、どうなりますか?コンパイル時に、コンパイラは共有クラスのストリームにどのタイプが適用されるかわからないので、コードが合成されることはありませんか?コンパイルに失敗しますか、コンパイルして実行時にクラッシュしますか、コンピューターから煙が出ますか?

4

2 に答える 2

6

テンプレート化されたメンバーは、ベース std::ostream の仮想メンバーではないため、ライブラリ内では表示されません。問題は発生しません。

于 2009-03-02T12:29:04.680 に答える
3

コンパイルされますが、オペレーターは呼び出されません。

于 2009-03-02T12:29:21.420 に答える