Tidak mungkin untuk sepenuhnya memenuhi syarat nama kelas dalam deklarator definisi fungsi di luar kelas

12

Program ini menghasilkan jalan buntu keserakahan yang tidak diinginkan:

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

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

: 8: 1: error: tidak ada anggota bernama 'C' di 'float4x4'; maksud Anda hanya 'C'?
float4x4 :: C :: M ()
^ ~~~~~~~~~~~

Yang bisa 'diperbaiki' menggunakan tipe trailing return:

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

sekarang semuanya baik-baik saja.

Jadi saya pikir kita tidak bisa sepenuhnya memenuhi syarat nama kelas saat menggunakan sintaks deklarator tipe-return-type?

v.oddou
sumber
2
Selama C ++ mengabaikan whitespace sekitar ::, saya kira tidak ada cara lain.
Yksisarvinen
@Someprogrammerdude ya, lihat ini godbolt.org/z/mt6GHD
v.oddou
3
Bagian ini ::Cterlihat seperti solusi untuk beberapa masalah lainnya. Kalau tidak, itu bisa saja C(seperti yang disarankan oleh kompiler;)
rustyx
2
@rustyx itu hanya pemindahan kode secara mekanis oleh transpiler yang tidak ingin menjalankan "mencari nama yang paling tidak memenuhi syarat" yang sangat kompleks pada posisi ini. memancarkan look-bypass nama FQ sepenuhnya dan nyaman untuk alat tersebut.
v.oddou

Jawaban:

10

Anda dapat mengurung tanda kurung:

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

Saya tidak dapat benar-benar memberi tahu Anda apa yang membuat aturan ini ok, sementara bukan tanpa tanda kurung, meskipun saya diuji dengan gcc dan dentang (keduanya -pedantic). Saya lebih suka tipe trailing return.

idclev 463035818
sumber
1
luar biasa. memang kita bisa. godbolt.org/z/KCFbJZ itu menjijikkan tapi mengagumkan. Tentu saja dari segi gaya, trailing sangat bagus. Tetapi dalam kasus saya, saya menargetkan dialek yang tidak mendukungnya.
v.oddou