Ответ 1
Это ошибка компилятора. VС++ делает что-то очень странное.
Например, это генерирует очень другое сообщение об ошибке:
struct A
{
template< typename T > static struct A Foo( void ) { return A(); }
struct S
{
template< typename T > static S GetInstance( void )
{
S Result;
Result.m_funcFoo = &A::Foo< T >;
return Result;
}
A ( *m_funcFoo )( void );
};
};
sourceFile.cpp(5) : error C3856: 'A::Foo': class is not a class template
И это работает:
struct X {};
struct A
{
template< typename T > static X Foo( void ) { return X(); }
struct S
{
template< typename T > static S GetInstance( void )
{
S Result;
Result.m_funcFoo = &A::Foo< T >;
return Result;
}
X ( *m_funcFoo )( void );
};
};
Очевидно, что это путает имя A
, которое должно ссылаться на базовый класс.
Добавление typedef не помогло, так же как и декларация в начале struct A
, также не соответствует имени как ::A
или struct A
.
Как ни странно, VС++ 7 прекрасно компилирует его.
Обходной путь: Изменение этого типа:
struct A
{
template< typename T > static A Foo( void ) { return A(); }
struct S;
};
struct A::S
{
template< typename T > static S GetInstance( void )
{
S Result;
Result.m_funcFoo = &A::Foo< T >;
return Result;
}
A ( *m_funcFoo )( void );
};
инвертирует результат, теперь VС++ 8 компилируется нормально, а VС++ 7 генерирует то же сообщение об ошибке.
Я думаю, что после завершения неполного типа и того же типа возникает проблема с идентификатором типа.
Все тесты выполняются с помощью Dinkumware Multi-Compiler Test Tool