3

クラスで作業する場合、すべて問題ありません。

struct Base1 {
  int value;
  Base1(int value) : value(value) { }
};

struct Test1 : public Base1 {
  int getValue() { return value; }  
  Test1(int value) : Base1(value) { }
};

ただし、テンプレートではスコープの解決が必要です。

template <typename T>
struct Base {
  T value;
  Base(T value) : value(value) { }
};

template <typename T>
struct Test : public Base<T> {
  typedef Base<T> parent;
  T getValue() { return parent::value; }  // why do I need to use parent:: here?
  Test(T value) : parent(value) { }
};

スコープの解決がないと、エラーが発生します'value' was not declared in this scope(gcc コンパイラを使用)。なんで?

4

2 に答える 2

6

コンパイラはvalueテンプレート引数に依存していることを認識していないためです。そのため、最初のパス (テンプレートをインスタンス化する前) で解決を試みますが、失敗します。

2 つのオプションは、スコープ解決を使用するか、使用することthis->valueです。thisは常に従属名であるため、これにより、2 番目のパスで強制的に評価が行われます。

http://ideone.com/07odYを参照

編集:そして、なぜそれを行う必要があるのか​​ について:

Test<T>は から派生していBase<T>ますが、テンプレートの特殊化により、Base<std::string>(たとえば) 通常Base<T>の とはまったく異なるものにすることができ、 という名前のメンバーを持たないvalueか、別の型などにすることができます。強制的に従属名にすることにより、コンパイラーは、チェックする前に、関連する実際の型がわかるまで待機することを余儀なくされます。

于 2012-05-23T15:07:20.203 に答える
3

依存名であることをコンパイラーに伝える他の方法がないため (Test本体内で定義されていないため) 。あなたはコンパイラに「わかりました! type にそのようなメンバーがあるvalueと言うとき、私を信じてください.」と言うように強制しています。valueT

于 2012-05-23T15:02:27.190 に答える