12

依存する基本クラスから型名をインポートするためにusing-declarationsが機能しないように見える理由を誰かが知っていますか?これらはメンバー変数と関数に対して機能しますが、少なくともGCC 4.3では、型に対して無視されているようです。

template <class T>
struct Base
{
  typedef T value_type;
};

template <class T>
struct Derived : Base<T>
{
  // Version 1: error on conforming compilers
  value_type get();

  // Version 2: OK, but unwieldy for repeated references
  typename Base<T>::value_type get();

  // Version 3: OK, but unwieldy for many types or deep inheritance
  typedef typename Base<T>::value_type value_type;
  value_type get();

  // Version 4: why doesn't this work?
  using typename Base<T>::value_type;
  value_type get(); // GCC: `value_type' is not a type
};

いくつかのレベルの継承を通じて継承したいアロケータスタイルのtypedefのセットを持つ基本クラスがあります。私がこれまでに見つけた最善の解決策は上記のバージョン3ですが、なぜバージョン4が機能しないように見えるのか興味があります。GCCはusing-declarationを受け入れますが、それを無視しているようです。

C ++ Standard、C++Progを確認しました。ラング。第3版 [Stroustrup]、およびC ++テンプレート[Vandevoorde、Josuttis]ですが、using-declarationsを依存する基本クラスタイプに適用できるかどうかについては言及されていないようです。

別の例を見るのに役立つ場合は、GCCメーリングリストで質問されているが実際には回答されていない同じ質問があります。質問者は、他の場所で「typenameの使用」を見たことがあるが、GCCはそれをサポートしていないようだと示しています。私はそれをテストするために利用できる別の適合コンパイラを持っていません。

4

2 に答える 2

10

Richard Cordenが指摘しているように、この問題は、2003標準が承認された後のC++標準コア言語欠陥レポートで対処されました。キーワードtypename/ templateはusing-declarationsとどのように相互作用しますか?

提案された決議(2003年4月、2003年10月改訂):

7.3.3[namespace.udecl]の下部に新しい段落を追加します。

using-declarationがキーワードtypenameを使用し、依存名(14.7.2 [temp.dep])を指定する場合、using-declarationによって導入された名前はtypedef-name(7.1.3 [dcl.typedef])として扱われます。 。

このテキストは、2003年10月15日以降の第2版の標準には表示されていないようです。

バグ14258で説明されているように、GCCはまだこの解決策を実装していません。

-------コメント#3ジョバンニバホから2004-02-27 12:47[返信]-------問題は、USING_DECLが「タイプ名」を記録しないことです。これが事実です。それを介してインポートされるタイプであること。これは、暗黙の型名拡張子のおかげで機能していたと思います。

重複するバグ21484は、「typenameの使用」がComeauおよびIntelコンパイラで機能することを示しています。MSVCはすべての名前を依存関係として扱うため、そのコンパイラーでは構成は不要です(ただし許可されています)。


2011年12月13日のGCC4.7で修正されました!

于 2009-07-01T21:22:52.413 に答える
-2

Base :: value_typeのtypedefを宣言する前に、Baseのテンプレートにアクセス指定子(public / protected / private)を含めませんでした。その結果、デフォルトでprivateになり、Baseから派生したクラスではアクセスできません。

于 2009-07-01T20:19:35.677 に答える