Не выводимый контекст в области шаблона - PullRequest
5 голосов
/ 06 декабря 2011
template<typename T>
struct Wrap {
  Wrap(T *p) {}
};

#ifdef TEMPLATE
template<typename T>
void foo (Wrap<T> t) {}  // version-1

#else
void foo (Wrap<int> p) {} // version-2
#endif

int main () {
  foo(new int);
}

Когда часть #else компилируется, компиляция идет хорошо, и выбирается версия-2. Если я попытаюсь скомпилировать #ifdef часть, я ожидаю, что должна быть выбрана версия-1. Однако компилятор выдает ошибку как,

ошибка: нет соответствующей функции для вызова `foo (int *) '

Касаюсь ли я неотъемлемой части template foo? Если да, то кто-нибудь может уточнить, каково точное правило для не вычитаемой области?

1 Ответ

3 голосов
/ 06 декабря 2011

Тип шаблона класса не может быть определен по аргументам, передаваемым его конструктору. Чтобы узнать, какие конструкторы доступны, компилятор должен уже выбрать, какой Wrap создать.

В блоке #else вы явно выбрали создание экземпляра Wrap<int>, поэтому компилятор знает, как использовать неявный конструктор Wrap<int>(int*).


Возможно, неофициально: тип не выводим, если его вывод предполагает знание того, что тип должен быть выведен.

...