Impossibile qualificare completamente il nome della classe nel dichiaratore fuori classe della definizione della funzione


12

Questo programma si traduce in un vicolo cieco di analisi avidità indesiderato:

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

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

: 8: 1: errore: nessun membro denominato "C" in "float4x4"; intendevi semplicemente "C"?
float4x4 :: C :: M ()
^ ~~~~~~~~~~~

Che può essere 'riparato' usando il tipo di ritorno finale:

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

ora tutto bene.

Quindi presumo che non possiamo qualificare completamente il nome della classe quando si utilizza la sintassi del dichiaratore di tipo intestazione-ritorno?


2
Fintanto che C ++ ignora lo spazio bianco in giro ::, suppongo che non ci sia altro modo.
Yksisarvinen,

@Someprogrammerdude sì, dai un'occhiata a godbolt.org/z/mt6GHD
v.oddou

3
La ::Cparte sembra una soluzione alternativa per qualche altro problema. Altrimenti avrebbe potuto essere semplicemente C(come suggerisce il compilatore;)
Rustyx,

2
@rustyx è solo una riemissione meccanica del codice da parte di un transpiler che non vuole eseguire un "trovare il nome meno qualificato" ultra complesso in questa posizione. l'emissione di un nome FQ ignora completamente la ricerca ed è conveniente per tali strumenti.
v.

Risposte:


10

Puoi mettere parentesi per chiarire:

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

Non posso davvero dirti quale regola rende tutto ok, mentre non è privo di parentesi, anche se ho provato con gcc e clang (entrambi -pedantic). Preferirei il tipo di ritorno finale.


1
incredibile. davvero possiamo. godbolt.org/z/KCFbJZ è disgustoso ma è fantastico. Naturalmente in termini di stile il finale è fantastico. Ma nel mio caso prendo di mira un dialetto che non lo supporta.
v.oddou il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.