2010-04-19 8 views
7

I tienen el siguiente código:¿Por qué las conversiones de operador no requieren implícitamente funciones con plantilla? (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); 
} 

Cuando compilar el código con gcc 4.3.3 consigo un mensaje (aaa.cc:17: error: no matching function for call to ‘tf(pointer<float>&)’) que indica que el compilador llamado 'operator pointer<const T>' para la función no templated f() , pero no lo hizo para la función con plantilla tf(). ¿Por qué y hay alguna solución alternativa a la sobrecarga de tf() con una versión const y non const?

Gracias de antemano por cualquier ayuda.

+0

¿quizás el software stackoverflow está eliminando los soportes angulares de su plantilla? – jonner

Respuesta

6

La razón es que usted no recibe las conversiones de tipo implícitas durante deducción plantilla, nunca llega a ese punto.

considerar:

template <typename T> 
struct foo {}; 

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

foo<int> f; 
bar(f); 

Por esa llamada a la barra, el compilador puede deducir que es un Uint, y crear una instancia de la función. Sin embargo, tenga en cuenta:

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

foo<int> f; 
bar(f); 

No hay U el compilador puede deducir de tal manera que el tipo de foo coincide con el tipo del parámetro. Ergo, instanciación de plantilla falla. No hay posibilidad de que la conversión suceda.

+0

Gracias. Eso es exactamente lo que necesitaba saber. –

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

^el compilador no coincida con una llamada a la función a esta función a menos que se especifique explícitamente un tipo de parámetro en la llamada a la función, ya que no utiliza el nombre de tipo U como un argumento de la función. Sospecho que quiere hacer algo como:

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