У меня есть следующий код:
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 () с версией неконстанты и константой?
Заранее спасибо за любую справку.
Причина в том, что вы не получаете неявных преобразований типов во время вывода шаблона, до этого никогда не доходит.
Рассмотрим:
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
соответствовал типу параметра. Следовательно, создание шаблона не выполняется. Нет никаких шансов на то, что преобразование произойдет.
template <typename U>
void tf(pointer<const float>);
^ Компилятор не будет сопоставлять вызов функции с этой функцией, если вы явно не укажете тип параметра при вызове функции, поскольку вы не используете typename U
в качестве аргумента функции. Я подозреваю, что вы хотите сделать что-то вроде:
template <typename U>
void tf(pointer<U>);