誰もが、依存宣言が従属する基底クラスから型名をインポートするために機能しないように見えるのは誰か知っていますか?それらはメンバ変数と関数で動作しますが、少なくとも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++ Progをチェックしました。 Lang。第3版[Stroustrup]、およびC++ Templates [Vandevoorde、Josuttis]のようなものであるが、use-declarationを従属基本クラス型に適用できるかどうかは明らかではない。
GCCのメーリングリストで、別の例(here is the same question being asked)が実際には答えられていないことが分かりました。 Askerは、 'typename'を他の場所で使っているのを見たことを示していますが、GCCはそれをサポートしていないようです。私はそれをテストするために利用可能な別のコンパイラを持っていない。
準拠しているコンパイラに対して(自分の意見では)コンパイルする必要があるコードを投稿します。テンプレートの使い方を投稿してください。 –
私はすべての関連情報は上記と考えています。バージョン1〜4はMSVC 9で動作します.MSVC 9は、非一段階の名前解決(つまりインスタンス化時)を持っています。バージョン2と3のみGCC 4.3で動作します。バージョン4が無効であるべき理由はわかりませんが、GCCはそれを受け入れません。 使い方については、これがどのようにインスタンス化されるかは実際問題ではありません。私はちょうどコンパイルするテンプレート宣言を取得しようとしています。上記のコードは、はるかに複雑なコンテナアダプタを単純化したものです。 –
ここにコードを投稿するときに、コンパイルするためにコードを編集する必要があるとは思わないでください。 –