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?


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.


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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.