Вот тестовый код
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: Я значительно изменил свой вопрос. Пожалуйста, не против.
EDIT: я задал этот вопрос людям EDG, и это то, что Майк Херрик должен был сказать
Мы диагностируем это как ошибку в режиме -strict, а также в любом режиме, который позволяет искать зависимые имена (например, --dep_name, --parse_templates). Зависимый поиск имени отключается в режимах эмуляции GNU, поэтому мы не испускаем эту ошибку в этом случае.
Обработка зависимых имен требует создания экземпляров прототипа nonclass (см. ниже). Как и при создании экземпляров прототипа nonclass, зависимый поиск имени, вероятно, вызовет ошибки компиляции при компиляции код, который не был написан с учетом этой функции.
В зависимых правилах поиска имен требуется, чтобы независимые имена были посмотрел на точку использования в определении шаблона, и что разрешение перегрузки должно выполняться на независящих вызовах в этой точке. Для зависимых вызовов набор рассмотренных имен является набором видимых в месте использования в определении шаблона плюс любые сделанные имена видимый зависящим от аргумента поиска в момент создания экземпляра. Обратите внимание: встроенные типы не имеют связанных пространств имен, поэтому вызовы только встроенные типы могут разрешать только имена, видимые в определение шаблона. Кроме того, имена из зависимых базовых классов не отображаются для неквалифицированных поисков.
Ниже приведены некоторые из наиболее распространенных проблем с кодом при поиске зависимого имени:
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;