コンパイラがSOのどこかでこのコードを処理できない理由を読んだことは間違いありませんが、数時間検索してもまだ見つかりません。関連するコードは次のとおりです。
#include <iostream>
template <typename T>
class base
{
};
class derived : base<derived::myStruct>
{
public:
struct myStruct
{
};
};
int main ()
{
return 0;
}
問題は、パーサーがbase<derived::myStruct>
解析する前に最初に特殊化を生成しようとするderived
ため、「エラーC2065:'myStruct':宣言されていない識別子」というエラーが発生することです。struct myStruct;
ばかげたトリックとして、すぐ上で事前に宣言すると、VS2010が文句を言うのをやめることに気づきましたclass derived
。私の意見では、myStruct
内部にバインドする必要がありderived
、このコードは同じエラーをスローするはずです:
#include <iostream>
template <typename T>
class base
{
};
struct myStruct;
class derived : base<derived::myStruct>
{
public:
struct myStruct
{
};
};
int main ()
{
return 0;
}
更新:gcc-4.5.1は予期されたエラーをスローできるので、上記はVS2010のバグだと思います...