Рассмотрим этот пример, который я нашел на веб-сайте IBM:
#include
using namespace std;
void f(double) { cout << "Function f(double)" << endl; }
template void g(T a) {
f(123);
h(a);
}
void f(int) { cout << "Function f(int)" << endl; }
void h(double) { cout << "Function h(double)" << endl; }
void i() {
extern void h(int);
g(234);
}
void h(int) { cout << "Function h(int)" << endl; }
int main(void) {
i();
}
Что будет печатать?
IBM Документация я адаптировал этот пример, доступный здесь , говорит, что он будет печать:
Функция f (Двойной)
Функция h (двойной)
Обоснование этого - это то, что шаблон-параметр, зависящий от параметра, зависящий от имени, выполняется прямо перед призрением I ()
, так что он находит H (двойной)
, но не h (int)
.
Когда я составляю его с помощью GCC 4.4.1, он печатает:
Функция f (Двойная)
Функция h (int)
GCC, похоже, смотрит вверх по шаблонам-параметрам, зависячавным имена в шаблоне после того, как все остальное было скомпилировано, поэтому он находит как H (Double)
и H (int)
и предпочитает последнее.
Когда я компилирую его с помощью Clang 2.8, он не скомпенсируется. Ошибка компилятора:
IBM_EXAMPLE.CC:8:3: ОШИБКА: Использование незаменимого идентификатора «H»
h (а);
^
IBM_EXAMPLE.CC:16:3: Примечание: в приведении присмотров функции шаблон специализации «G » запрашивается здесь
g (234);
^
1 сгенерирована ошибка.
Clang, похоже, воспринимает имена, зависящие от шаблона-параметра в шаблоне в точке, когда шаблон объявлен, поэтому он не находит ни H (Double)
, ни H (int)
.
Какой из них прав?