依存基底クラスからのアクセスの種類
-
21-08-2019 - |
質問
は、誰でも知っていますか?彼らは、メンバ変数と関数のために働くが、少なくとも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宣言を受け入れ、それを無視するようです。
私はC ++標準、C ++プログレをチェックしました。ラング。第3版。 [Stroustrup氏]、及びC ++テンプレート[Vandevoorde、Josuttis氏]が、いずれも使用して、宣言依存基底クラス型に適用することができるかどうかに対処するように見えるていない。
の場合、それは別の例を参照するのに役立ちます、ここにあります同じ質問はを尋ねたが、実際にGCCのメーリングリストで、答えではないされています。アスカーは、彼が他の場所で「型名を使用して」見ていることを示しているが、そのGCCは、それをサポートしていないようです。私はそれをテストするために利用できる別の準拠のコンパイラを持っていません。
解決
リチャードコーデンが指摘するように、この問題は C ++標準のコア言語不具合レポートの2003規格が批准された後:<のhref =「http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#11」のrel = 「noreferrer」>キーワード型名/テンプレートが使用して、宣言と対話する方法を教えてくださいの
決議案(2003年4月、 2003年10月改訂):
の下に新しい段落を追加します。 7.3.3 [namespace.udecl]:
using宣言を使用している場合 キーワード型名とは、指定 依存名(14.7.2 [temp.dep])、 によって導入された名前 using宣言は以下のように処理され typedef名(7.1.3 [dcl.typedef])。
このテキストは2003年10月15日からSecond Editionの標準に表示されていないようです。
バグ14258 GCCはまだ、この解像度を実装していません。 >:------- -------ジョバンニバホ2004年2月27日12時47分[返信]から#3コメント 問題は、私たちのUSING_DECLにはないということです つまり、「型名」を記録 それがあるタイプであるという事実 それを介して輸入。これは動作するために使用しました 暗黙の型の名前のおかげで 拡張、私は信じています。
重複「型名を使用して」コモに働くことを示しているのバグ21484そして、インテル®コンパイラー。 MSVCが依存としてすべての名前を扱いますので、構築物は、そのコンパイラのための不要な(しかし許可)です。
<時間> 12月13日にGCC 4.7での 固定する 2011!の
他のヒント
あなたはベースのtypedef :: VALUE_TYPEを宣言する前にベースのテンプレートでアクセス指定子を(パブリック/プライベート/保護された)含まれていませんでした。その結果、民間へのデフォルトとは、基地から派生したクラスではアクセスできません。