以下の構造のコードがあります(実際はもっと複雑ですが、特に "Base"は3ライナーですが、その要旨)キャプチャ:私は本当に理解していない打ち鳴らすと++私は、エラーメッセージが表示されます、'using'ステートメントがg ++でコンパイルされ、clangでコンパイルに失敗する
g++ -c test.cpp -std=c++11
しかし経由
template <class T>
class A {};
template <class T>
class B {
public:
B(){};
};
template <class T>
class C : public B<A<T>> {
public:
using Base = B<A<T>>;
using Base::B;
};
static const C<int> c{};
コードをg ++で罰金コンパイルを
clang++ -c test.cpp -std=c++11
test.cpp:14:14: error: dependent using declaration resolved to type without 'typename' using Base::B;
私のコードに問題がありますか、これはclangのバグですか?
注:using B<A<T>>::B;
を書くとき、両方のコンパイラでうまくコンパイルされますが、これは私の問題の本当の解決策ではありません。
編集:打ち鳴らすのバージョンは、gccのバージョン3.5.0でセクション12.1から4.9.2
継承コンストラクタを使用する場合、 'using'は型ではなくコンストラクタに名前を付けます。したがって、' typename'は間違っています。とにかく、 'Base :: Base'を使うのはうまくいくはずです - それをコンストラクタに解決する特別なルックアップがあります。 http://coliru.stacked-crooked.com/a/5e01aeb4d26b312e –
ご説明いただきありがとうございます。 'Using Base :: Base'は、私のプロダクションコードの素晴らしい解決策です。しかしながら、「Base :: Bを使用する」が有効であるかどうかは疑問である。私にとって、 'typename'の間違った言及は、clangに何か問題があることを示唆しています。私はC++の専門家ではありません。 –
はい、これが打ち鳴らすのバグのように見えます。そこ 'B を使用しない理由は、Bは::>ません;'と 'ベース:: Bを使用して、'別々に扱われるべきです。 –