Imposible calificar completamente el nombre de clase en la definición de declarador de función fuera de clase

12

Este programa da como resultado un punto muerto de codicia no deseada:

struct float4x4 {};
class C
{
    float4x4 M();
};

float4x4 ::C::M()
{
    return float4x4{};
}

: 8: 1: error: ningún miembro llamado 'C' en 'float4x4'; ¿quiso decir simplemente 'C'?
float4x4 :: C :: M ()
^ ~~~~~~~~~~~

Que se puede 'arreglar' usando el tipo de retorno final:

auto ::C::M() -> float4x4
{}

ahora todo bien.

Entonces, supongo que no podemos calificar completamente el nombre de la clase cuando usamos la sintaxis de declarador de tipo retorno-encabezado.

v.oddou
fuente
2
Mientras C ++ ignore el espacio en blanco ::, supongo que no hay otra manera.
Yksisarvinen
@Someprogrammerdude sí, mira esto godbolt.org/z/mt6GHD
v.oddou
3
La ::Cparte parece una solución alternativa para algún otro problema. De lo contrario, podría haber sido simplemente C(como sugiere el compilador;)
rustyx
2
@rustyx es solo una reemisión mecánica de código por un transpilador que no quiere ejecutar un "nombre menos calificado" ultra complejo en esta posición. emitir un nombre FQ omite la búsqueda por completo y es conveniente para tales herramientas.
v.oddou

Respuestas:

10

Puede poner corchetes para desambiguar:

float4x4 (::C::M)()
{
    return float4x4{};
}

Realmente no puedo decirte qué regla hace que esto esté bien, aunque no está sin los corchetes, aunque probé con gcc y clang (ambos -pedantic). Preferiría el tipo de retorno final.

idclev 463035818
fuente
1
increíble. de hecho podemos. godbolt.org/z/KCFbJZ es asqueroso pero es asombroso. Por supuesto, en términos de estilo, el seguimiento es excelente. Pero en mi caso apunto a un dialecto que no lo admite.
v.oddou