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.