А вот еще один на мой взгляд баг MS VC++ 2010.
Рассмотрим код
namespace N1
{
struct Outer;
namespace N2
{
struct Outer;
void f( Outer * );
}
struct Outer { int a; };
namespace N2
{
struct Outer { int a[2]; };
}
}
void N1::N2::f( Outer *p )
{
std::cout << "sizeof( *p ) = " << sizeof( *p ) << std::endl;
}
MS VC++ 2010 не компилирует этот код, сообщая об ошибке в определении функции
f: "Error: использование неопределенного типа N1::N2::Outer. См. объявление N1::N2::Outer"
То есть получается, что когда функция
f определяется, то компилятор не видет определение типа
Outer в виду того, что объявление функции было сделано ранее определения класса
Outer.
Borland C++ Builder 5.0 компилирует этот код без проблем. Интересно, а как другие компиляторы относятся к \тому коду?