разрешение имен типов в случаях неоднозначности

Я играл с 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 статус выхода

0
задан parapura rajkumar 16 November 2011 в 02:04
поделиться