เป็นไปไม่ได้ที่จะจัดคลาสคลาสชื่ออย่างเต็มที่ในตัวประกาศนอกคลาสของนิยามฟังก์ชัน


12

โปรแกรมนี้ส่งผลให้เกิดการแยกวิเคราะห์ความโลภที่ไม่ต้องการ:

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

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

: 8: 1: ข้อผิดพลาด: ไม่มีสมาชิกชื่อ 'C' ใน 'float4x4'; คุณหมายถึง 'C' อย่างง่ายๆหรือเปล่า
float4x4 :: C :: M ()
^ ~~~~~~~~~~~

ซึ่งสามารถ 'แก้ไข' โดยใช้ประเภทการส่งคืนต่อท้าย:

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

ตอนนี้ทุกอย่างดี

ดังนั้นฉันคิดว่าเราไม่สามารถผ่านการรับรอง class-name เมื่อใช้ไวยากรณ์


2
ตราบใดที่ C ++ ละเว้นช่องว่างรอบ ๆ::ฉันคิดว่าไม่มีวิธีอื่น
Yksisarvinen

@Someprogrammerdude อ๋อลองดูgodbolt.org/z/mt6GHD
v.oddou

3
::Cส่วนหนึ่งดูเหมือนว่าวิธีแก้ปัญหาสำหรับปัญหาอื่น ๆ บาง มิฉะนั้นอาจเป็นเรื่องง่ายC(เช่นคอมไพเลอร์แนะนำ;)
46418

2
@rustyx เป็นเพียงการปล่อยรหัสเชิงกลโดย transpiler ที่ไม่ต้องการเรียกใช้ชื่อ "ค้นหาชื่อที่มีคุณสมบัติน้อยที่สุด" ที่ซับซ้อนเป็นพิเศษในตำแหน่งนี้ การเปล่งชื่อ FQ- ข้ามการค้นหาอย่างสมบูรณ์และสะดวกสำหรับเครื่องมือดังกล่าว
v.oddou

คำตอบ:


10

คุณสามารถใส่เครื่องหมายวงเล็บเพื่อแก้ความกำกวม:

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

ฉันไม่สามารถบอกคุณได้ว่ากฎใดที่ทำให้สิ่งนี้ดีในขณะที่มันไม่ได้อยู่ในวงเล็บแม้ว่าฉันจะทดสอบด้วย gcc และเสียงดังกราว (ทั้งคู่-pedantic) ฉันต้องการประเภทการคืนส่วนท้าย


1
เหลือเชื่อ แน่นอนเราทำได้ godbolt.org/z/KCFbJZมันน่าขยะแขยง แต่มันยอดเยี่ยม แน่นอนในแง่ของรูปแบบการลากที่ยอดเยี่ยม แต่ในกรณีของฉันฉันกำหนดเป้าหมายภาษาถิ่นที่ไม่รองรับ
v.oddou
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.