Impossível qualificar totalmente o nome da classe no declarador fora da classe da definição de função

12

Este programa resulta em um beco sem saída indesejável:

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

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

: 8: 1: erro: nenhum membro chamado 'C' em 'float4x4'; você quis dizer simplesmente 'C'?
float4x4 :: C :: M ()
^ ~~~~~~~~~~~

Que pode ser 'corrigido' usando o tipo de retorno à direita:

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

agora tudo de bom.

Então, presumo que não podemos qualificar totalmente o nome da classe ao usar a sintaxe do declarador de cabeçalho-retorno-tipo?

v.oddou
fonte
2
Desde que o C ++ ignore o espaço em branco ::, suponho que não haja outra maneira.
Yksisarvinen 18/11/19
@Someprogrammerdude sim, verifique isso godbolt.org/z/mt6GHD
v.oddou
3
A ::Cpeça parece uma solução alternativa para outro problema. Caso contrário, poderia ter sido simplesmente C(como o compilador sugere;)
rustyx
2
@rustyx é apenas a reemissão mecânica de código por um transpilador que não deseja executar um "complexo nome menos qualificado" ultra-complexo nesta posição. emitir um nome FQ ignora completamente a pesquisa e é conveniente para essas ferramentas.
v.oddou

Respostas:

10

Você pode colocar colchetes para desambiguar:

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

Eu realmente não posso dizer qual regra faz com que isso funcione, embora não fique sem os colchetes, embora eu tenha testado com gcc e clang (ambos -pedantic). Eu preferiria o tipo de retorno à direita.

idclev 463035818
fonte
11
incrível. de fato nós podemos. godbolt.org/z/KCFbJZ isso é nojento, mas é incrível. Obviamente, em termos de estilo, a trilha é ótima. Mas, no meu caso, viso um dialeto que não o suporta.
v.oddou