为什么不隐式调用模板化函数的运算符转换? (C )

前端之家收集整理的这篇文章主要介绍了为什么不隐式调用模板化函数的运算符转换? (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:错误:没有匹配函数用于调用’tf(指针< float>&)’),表明编译器调用了’operator pointer< const T>‘对于非模板化函数f(),但没有用于模板化函数tf().为什么并且有没有解决方法没有使用const和非const版本重载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的类型与参数的类型匹配.因此,模板实例化失败.转换没有机会发生.

猜你在找的C&C++相关文章