Errores, fallos, preguntas - página 2006

 
fxsaber:

¿Por qué deben compilar ambos?

En general, utilizo poco las plantillas - no he entrado en detalles - sólo puedo explicarlo a nivel intuitivo

En el segundo caso, una sustitución directa de T por A* compila bien, por lo que la plantilla también debería compilar

class A {};
void f( A * const ) {}
void OnStart()
{
        A *a;
        f( a ); //нормально
}

En el 1er caso, una sustitución directa no funciona, pero puede añadir el parámetro redundante T2 - con él compila normalmente - por lo que debería sin él - por eso es redundante

template<typename T, typename T2>
void f( T, const T2 ) {}
class A {};
void OnStart()
{
        const A *a;
        f( a, a ); //нормально
}
 
A100:

Intuitivamente, const es a veces parte de un tipo y a veces sólo un identificador, que dentro de la función el puntero será const.

Esto se puede sentir a través dePrint(__FUNCSIG__);

 
El valor de reducción en la tabla de optimización se muestra de forma extraña. Muestra la reducción máxima por medio (pero se escribe en porcentaje). Pero después de una sola prueba resulta que la reducción relativa difiere de la máxima (el porcentaje es mayor o menor). Cuando se utiliza la gestión del dinero, ¿es necesario añadir algo más para mostrar los resultados requeridos?
 
A100:

Error de compilación

template<typename T>
void f( T, const T ) {}
class A {};
void OnStart()
{
        A * const a = new A;
        f( a, a ); //error: 'a' - cannot convert from const pointer to nonconst pointer
}
Así es como se compila, la versión original no debería.
 
Комбинатор:
Así es como se compila, la versión original no debería.

¿Por qué?

template<typename T>
struct B {
        void f( T, const T ) {}
};
class A {};
void OnStart()
{
          const A* a;
        B<const A*> b;
        b.f( a, a ); //нормально
}

Así que está bien. ¿Qué ha cambiado en principio?

template<typename T>
        void f( T, const T ) {}
class A {};
void OnStart()
{
          const A *a;
          f( a, a ); //error: 'a' - cannot convert from const pointer to nonconst pointer
}
 
A100:

¿Qué ha cambiado fundamentalmente?

La diferencia es enorme. Eso es lo que llamaste.

void B<const A*>::f(const A*,const A*)
El compilador falla en el sentido de que no puede averiguar la versión correcta de la plantilla. Obviamente se lo dijo.
template<typename T>
        void f( T, const T ) {}
class A {};
void OnStart()
{
          const A *a;
          f<const A*>( a, a );
}

Y está funcionando.

 
fxsaber:
Y está funcionando.

¿Por qué los caracteres adicionales?

 
A100:

¿Por qué los caracteres adicionales?

Para demostrar que el compilador no adivina una versión perfectamente viable del patrón.

 
fxsaber:

Para demostrar que el compilador no adivina una versión perfectamente viable del patrón.

¿Por qué debería hacerlo? El ServiceDesk puede resolverlo por sí mismo

 
A100:

¿Por qué?

A juzgar por su especialización, el tipo debería tener constantes descartes, lo que hace. Si se especifica explícitamente el tipo correcto, por supuesto que se compilará.
Razón de la queja: