Ключевое слово «шаблон» не требуется? [gcc / clang / Comeau bug?]

Вот тестовый код

template <class T> void f()
{
  T t;
  t.f<T>(0); //compiles even without the "template" keyword, what am I missing?
}

class abc
{
  public:
  template <typename T>
  void f (int){}
};

int main()
{
  f<abc>();
}

Я использую g ++ 4.4.6. Спасибо

P.S: Я значительно отредактировал свой вопрос. Пожалуйста, не возражайте.

РЕДАКТИРОВАТЬ : Я задал этот вопрос людям EDG, и это то, что сказал Майк Херрик

Мы диагностируем это как ошибку в режиме --strict, а также в любом режиме, который разрешает зависимый поиск имени ( например, --dep_name, --parse_templates). Зависимый поиск имени отключен в режимах эмуляции GNU, поэтому мы не выдаем эту ошибку в этом случае.

Зависимая обработка имен требует, чтобы экземпляры прототипа некласса быть включенным (см. ниже). Как и в случае с неклассовыми экземплярами прототипов, включение зависимый поиск имени может вызвать ошибки компиляции при компиляции код, который был написан без учета этой функции.

Правила поиска зависимых имен требуют, чтобы независимые имена посмотрел на точку использования в определении шаблона, и что разрешение перегрузки должно выполняться для независимых вызовов в этот момент. Для зависимых вызовов набор имен рассматривается как набор видимых в момент использования в определении шаблона плюс любые имена, сделанные виден при поиске, зависящем от аргументов, в момент создания экземпляра. Обратите внимание, что встроенные типы не имеют связанных пространств имен, поэтому вызывает только со встроенными типами может разрешать только имена, видимые в определение шаблона.Кроме того, имена из зависимых базовых классов не видны неквалифицированным поисковым запросам.

Ниже показаны некоторые из наиболее часто встречающихся проблем с кодом. при использовании зависимого поиска имени:

template <class T> struct B {
    void f();
  };

template <class T> struct A : public B<T> {
    X x;  // error: X not visible yet (formerly an error in strict mode)
    void g() {
      f();        // error: B<T>::f not visible
      this->f();  // must be written this way
      h(1);  // error: h(int) not visible using argument-dependent lookup
    }
  };
struct X {};
void h(int);
A<int> ai;
10
задан Prasoon Saurav 26 January 2012 в 04:07
поделиться