次のスニペットをコンパイルするとg++
template<class T>
class A
{};
template<class T>
class B
{
public:
typedef A<T> A;
};
コンパイラが教えてくれる
error: declaration of ‘typedef class A<T> B<T>::A’
error: changes meaning of ‘A’ from ‘class A<T>’
一方、に変更するtypedef
と、
typedef ::A<T> A;
すべてが正常にコンパイルされg++
ます。Clang++ 3.1 はどちらの方法も気にしません。
なぜこうなった?そして、2番目の行動基準はありますか?