0

次のコードを検討してください。

struct Foo
{
    Foo operator+(const Foo &rhs) const;
    // notice lack of: Foo operator*(const Foo &rhs) const;
};

template <class T>
struct Bar
{
    T x, y;
    T add() const { return x + y; }
    T mul() const { return x * y; }
};

2つの質問があります:

  1. 何か意味のあるものから継承しBar<Foo>てオーバーライドできますか?mul()

  2. どこでも使用しない場合、Bar<Foo>オーバーライドせずに継承できますか?mul()mul()

4

2 に答える 2

3
  1. Bar<Foo>::mul()は仮想関数ではないため、オーバーライドすることはできません。

  2. はい、テンプレートメンバー関数を使用しない場合、インスタンス化されません。また、インスタンス化の結果として発生するエラーも発生しません。

サブクラスで同じシグニチャの関数を提供することで非表示 にできますが、 2のため、インスタンス化されません。ただし、これはおそらく良い習慣ではありません。読者は非表示とオーバーライドについて混乱する可能性があり、単に別の関数名を使用して決して使用しない、またはBar for Fooの明示的な特殊化を提供するよりも、これを行うことにはあまりメリットがありません。Bar<Foo>::mul()Bar<Foo>::mul()mul()

于 2012-06-29T14:31:07.560 に答える
3
  1. 承知しました
  2. 承知しました

テンプレートは実際には一種のスマートプリプロセッサであり、コンパイルされていません。何かを使用しない場合は、完全な(構文的に正しい)ゴミを書くことができます。

template <class T>
struct Bar
{
    T x, y;
    T add() const { return x + y; }
    T mul() const { return x.who cares what-s in here; }
};

PS +演算子はconst関数で使用されているため、constとしても宣言する必要があります。

編集:OK、すべてのコンパイラがこれをサポートしているわけではありません。gccでコンパイルするコンパイラは次のとおりです。

template <class T>
struct Bar
{
    T x, y;
    T add() const { return x + y; }
    T mul() const { T::was_brillig & T::he::slith(y.toves).WTF?!0:-0; }
};
于 2012-06-29T14:50:51.087 に答える