我有以下代码:
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>&)’
),指示编译器为非模板化函数f()调用了'operator pointer<const T>'
,但没有为模板化函数tf()。为什么并且是否有任何解决方法没有使用const和非const版本重载tf()?
提前感谢您的帮助。
答案 0 :(得分:6)
原因是你在模板推导过程中没有获得隐式类型转换,它永远不会到达那一点。
考虑:
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 :(得分:1)
template <typename U>
void tf(pointer<const float>);
^除非在函数调用中显式指定参数类型,否则编译器将不匹配对此函数的函数调用,因为您不使用typename U
作为函数参数。我怀疑你想做点什么:
template <typename U>
void tf(pointer<U>);