Это ошибка компилятора.VC ++ делает что-то очень странное.
Например, это генерирует совершенно другое сообщение об ошибке:
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
, которое должно ссылаться на базовый класс.
Добавление определения типа не помогло, равно как и предварительное объявление struct A
, равно как и квалификация имени как ::A
или struct A
.
Как ни странно, VC ++ 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 );
};
инвертируетрезультат, теперь VC ++ 8 компилируется нормально, а VC ++ 7 генерирует одно и то же сообщение об ошибке.
Я думаю, что существует проблема идентификации типа между неполным типом и тем же типом после завершения.
Все тесты выполняются с использованием Dinkumware Multi-Compiler Test Tool