Я играл с Visual Studio и шаблонами.
Рассмотрим этот код
struct Foo
{
struct Bar
{
};
static const int Bar=42;
};
template<typename T>
void MyFunction()
{
typename T::Bar f;
}
int main()
{
MyFunction<Foo>();
return 0;
}
Когда я компилирую это Visual Studio 2008 и 11, я получаю следующую ошибку
error C2146: syntax error : missing ';' before identifier 'f'
Правильно ли Visual Studio в этом отношении? Код нарушает какие-либо стандарты?
Если я изменю код на
struct Foo
{
struct Bar
{
};
static const int Bar=42;
};
void SecondFunction( const int& )
{
}
template<typename T>
void MyFunction()
{
SecondFunction( T::Bar );
}
int main()
{
MyFunction<Foo>();
return 0;
}
компилируется без каких-либо предупреждений. В Foo :: BLAH член предпочтительнее типа в случае конфликтов?
РЕДАКТИРОВАТЬ Тесты на G ++ 4.2.1
struct Foo
{
static const int Bar=42;
};
void SecondFunction(const int& x)
{
}
template<typename T>
void MyFunction()
{
int x = Foo::Bar;
}
int main()
{
MyFunction<Foo>();
return 0;
}
компилирует ОК.
struct Foo
{
static const int Bar=42;
};
void SecondFunction(const int& x)
{
}
template<typename T>
void MyFunction()
{
SecondFunction(T::Bar);
}
int main()
{
MyFunction<Foo>();
return 0;
}
дает мне эти ошибки
Неопределенные символы:
"Foo :: Bar", по ссылке с:
void MyFunction () в cck498aS.o
ld: символ (ы) не найден
collect2: ld вернул 1 статус выхода