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

时间:2010-04-19 17:39:42

标签: c++ templates implicit

我有以下代码:

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()?

提前感谢您的帮助。

2 个答案:

答案 0 :(得分:6)

原因是你在模板推导过程中没有获得隐式类型转换,它永远不会到达那一点。

考虑:

template <typename T>
struct foo {};

template <typename U>
void bar(foo<U>)
{}

foo<int> f;
bar(f);

对于对bar的调用,编译器可以推断出Uint,并实例化该函数。但是,请考虑:

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>);