Почему операторные преобразования неявно требуются для шаблонных функций? (C ++) - PullRequest
7 голосов
/ 19 апреля 2010

У меня есть следующий код:

template <class T>
struct pointer
{
  operator pointer<const T>() const;
};


void f(pointer<const float>);

template <typename U>
void tf(pointer<const U>);

void g()
{
  pointer<float> ptr;
  f(ptr);
  tf(ptr);
}

Когда я компилирую код с помощью gcc 4.3.3, я получаю сообщение (aaa.cc:17: error: no matching function for call to ‘tf(pointer<float>&)’), указывающее, что компилятор вызвал 'operator pointer<const T>' для не шаблонной функции f (), но не для шаблонной функции tf ( ). Почему и есть ли обходной путь за исключением перегрузки tf () с константной и неконстантной версией?

Заранее спасибо за любую помощь.

Ответы [ 2 ]

6 голосов
/ 19 апреля 2010

Причина в том, что вы не получаете неявные преобразования типов во время вывода шаблона, он никогда не достигает этой точки.

Рассмотрим:

template <typename T>
struct foo {};

template <typename U>
void bar(foo<U>)
{}

foo<int> f;
bar(f);

Для этого вызова bar компилятор может определить, что U является int, и создать экземпляр функции. Однако рассмотрим:

template <typename U>
void bar(foo<const U>)
{}  // note  ^^^^

foo<int> f;
bar(f);

Нет U, который компилятор может вывести так, чтобы тип foo соответствовал типу параметра. Следовательно, создание шаблона не удалось. Нет никаких шансов для преобразования.

1 голос
/ 19 апреля 2010
template <typename U>
void tf(pointer<const float>);

^ Компилятор не будет сопоставлять вызов функции с этой функцией, если вы явно не укажете тип параметра при вызове функции, поскольку вы не используете имя типа U в качестве аргумента функции. Я подозреваю, что вы хотите сделать что-то вроде:

template <typename U>
void tf(pointer<U>);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...