Почему преобразования оператора неявно не требуются шаблонные функции? (C++)

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

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 () с версией неконстанты и константой?

Заранее спасибо за любую справку.

7
задан sbi 19 April 2010 в 17:54
поделиться

2 ответа

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

Рассмотрим:

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 соответствовал типу параметра. Следовательно, создание шаблона не выполняется. Нет никаких шансов на то, что преобразование произойдет.

6
ответ дан 7 December 2019 в 07:42
поделиться
template <typename U>
void tf(pointer<const float>);

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

template <typename U>
void tf(pointer<U>);
1
ответ дан 7 December 2019 в 07:42
поделиться
Другие вопросы по тегам:

Похожие вопросы: