2010-04-19 53 views
7

我有以下代码:为什么运算符转换不会隐式调用模板函数? (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: error: no matching function for call to ‘tf(pointer<float>&)’)的代码,指示被叫'operator pointer<const T>'用于非模板函数f编译器() ,但没有用于模板函数tf()。为什么和是否有任何解决方法缺少重载tf()与const和非const版本?

在此先感谢您的帮助。

+0

也许stackoverflow软件正在删除您的模板尖括号? – jonner 2010-04-19 17:41:59

回答

6

的原因是,你不扣除模板中获得隐式类型转换,它从来没有得到这一点。

考虑:

template <typename T> 
struct foo {}; 

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

foo<int> f; 
bar(f); 

对于呼叫禁止,编译器可以推断Uint,并实例化功能。然而,考虑:

template <typename U> 
void bar(foo<const U>) 
{} // note ^^^^ 

foo<int> f; 
bar(f); 

没有U编译器可以推断出,使得foo类型参数的类型相匹配。 Ergo,模板实例化失败。转换不会发生。

+0

谢谢。这正是我需要知道的。 – 2010-04-19 18:00:34

1
template <typename U> 
void tf(pointer<const float>); 

^编译器将不会匹配函数调用这个函数,除非你明确地在函数调用指定的参数类型,因为你不使用类型名U作为函数参数。我怀疑你想要做的事,如:

template <typename U> 
void tf(pointer<U>);