Я играл с 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 ';' перед идентификатором '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: symbol ( s) не найден collect2: ld вернул 1 статус выхода