сопоставление шаблонной функции в g ++ - PullRequest
4 голосов
/ 09 ноября 2010

У меня странная проблема, и мне интересно, почему g ++ 4.1.2 ведет себя так, как он.

Раздели к его основам:

#include <iostream>

template<typename T>
inline void f(T x) { std::cout << x*x; }

namespace foo {
  class A {
  public:
    void f() const { f(2); }
  };
}

Сбой вызова f(2), поскольку компилятор не соответствует функции шаблона f. Я могу заставить его работать с ::f(2), но я хотел бы знать, ПОЧЕМУ это необходимо, поскольку это совершенно однозначно, и насколько мои (по общему мнению, устаревшие) знания правил сопоставления, это должно работать.

Ответы [ 3 ]

12 голосов
/ 09 ноября 2010

Компилятор проверяет все области для кандидата, начиная с текущей области.Он находит функцию с именем f в непосредственной области действия и останавливает поиск .Ваша шаблонная версия никогда не рассматривается в качестве кандидата.

См. Пространства имен и принцип интерфейса для полного объяснения.

5 голосов
/ 09 ноября 2010

См. Раздел C ++ 03

3.4.1 Поиск безоговорочного имени

Во всех случаях, перечисленных в 3.4.1, в областях ищется объявление впорядок указан в каждой из соответствующих категорий; поиск имени заканчивается, как только найдено объявление для имени .Если объявление не найдено, программа неверно сформирована.

В вашем примере кода компилятор находит имя f в текущей области видимости, тем самым заканчивая поиск неквалифицированного имени, но имеется несоответствие впрототипы функций и поэтому вы получаете ошибку.

Квалификация с :: заставляет его работать, потому что имя ищется в глобальном пространстве имен и вызывается f с правильным прототипом.

2 голосов
/ 09 ноября 2010

Кажется, что компилятор пытается вызвать A :: f и терпит неудачу из-за аргумента, который кажется нормальным в некотором смысле.Есть ли у вас такая же ошибка, если вы используете не шаблонную функцию?

...