我有以下代码:
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的类型与参数的类型匹配.因此,模板实例化失败.转换没有机会发生.