Вот код теста
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. Спасибо
П.С .: Я значительно отредактировал свой вопрос. Пожалуйста, не возражайте.
РЕДАКТИРОВАТЬ : Я задал этот вопрос людям 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;