このコードは有効ですか?C++(11)?複数の継承で隠された入れ子クラス
struct Base {
template <typename>
struct nested;
};
struct Derived1 : Base { };
struct Derived2 : Base { };
struct Derived3 : Derived1, Derived2 { };
typedef Derived3::nested<int> xxx;
私は上記のコードを使用してコンパイルに失敗し
知っ:
- アップルLLVM 5.0(打ち鳴らす-500.2.75)を
- クラン3.4
しかし、それは正常にコンパイルします:
0また- のgcc 4.9.0 20131110(実験)
- のgcc 4.8
、私はすなわち
struct Base {
struct nested;
};
...
typedef Derived3::nested xxx;
、非テンプレート型にnested
タイプを変更した場合、それは動作します上記のコンパイラを使用してください。
[編集] も何も変わりませんテンプレートエイリアスにnested
テンプレート構造体を変更します。
template <typename> struct dependent { struct type; };
struct Base {
template <typename T>
using nested = typename dependent<T>::type;
};
上記のコンパイラでも同じ結果が得られます。 N3242から [エンド編集]
§10.1[class.mi]
クラスが複数回間接基本クラスとすることができ、直接的および間接的な基本クラスとすることができます。そのようなクラスではできることは限られています。直接基底クラスの非静的データメンバーおよびメンバー関数は、派生クラスのスコープ内で参照することはできません。ただし、静的メンバー、列挙型および型は明白に参照できます。
私はそれはコードが有効でなければならないことを意味し考えるが、私はよく分かりません。
私はバグ(?)がまだclang 5.0に残っているように見えるので、OPによって満たされた[バグレポート](https://bugs.llvm.org/show_bug.cgi?id=17929)(id 17929)を探しました.1。残念ながら、何の答えもありませんでした。 – Caninonos