私はGCC 6.2.0だけではなく、Clang 3.9.0(両方とも-std=c++14
モード)でしか現れないエラーに遭遇しました。私はどのような動作が正しいか(バグを報告する必要があるかどうか)は不明です。 GCCでフレンドクラス、継承、およびtypedef - 動作は正しいですか?
template<typename type_t>
class foo_t
{
};
class bar_t
{
public:
using foo_t = int;
};
class baz_t:
public bar_t
{
private:
template<typename type_t>
friend class foo_t;
};
これは、次のエラー得られます:ここで
コードだ、私はC++標準の知っていることから、
test.cpp:17:15: error: using typedef-name ‘using foo_t = int’ after ‘class’
friend class foo_t;
^~~~~
test.cpp:9:19: note: ‘using foo_t = int’ has a previous declaration here
using foo_t = int;
^
を、親typedef
年代(またはusing
複数可)に漏れてはなりません子のスコープに入れて、明示的に名前を修飾する必要があります(例:Propagating 'typedef' from based to derived class for 'template'を参照)。 GCCはここでは間違っているようですが、C++の知識が自信を持って語ることはそれほど確かではありません。
ありがとうございました!
面白い回避策: 'friend class :: foo_t'が動作します。 –
':: foo_t'はグローバルスコープを意味するためです。 '::'がなければ、コンパイラは可能な限り最も近いスコープを処理します –
誰かが興味を持っている場合 - 私はhttps://gcc.gnu.org/に適用された回避策で私の新しい例でICEに関するバグを提出しました。 bugzilla/show_bug.cgi?id = 77869 –