Sınıf dışı işlev tanımlayıcısında sınıf adını tam olarak nitelendirmek imkansız


12

Bu program, istenmeyen bir ayrıştırma hırslı çıkmaz ile sonuçlanır:

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

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

: 8: 1: hata: 'float4x4' içinde 'C' adlı üye yok; sadece 'C' mi demek istediniz?
float4x4 :: C :: M ()
^ ~~~~~~~~~~~

Sondaki dönüş türü kullanılarak 'sabit' olabilir:

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

şimdi hepsi iyi.

Başlık-dönüş-tipi bildirici sözdizimini kullanırken sınıf ismini tam olarak niteleyemeyeceğimi mi sanıyorum?


2
C ++ etrafındaki boşluğu görmezden geldiği sürece ::, başka bir yol olmadığını varsayalım.
Yksisarvinen

@Someprogrammerdude evet, bunu kontrol et godbolt.org/z/mt6GHD
v.oddou

3
::CBölüm diğer bazı sorunun çözümü gibi görünüyor. Aksi takdirde basit olabilirdi C(derleyici önerdiği gibi;)
rustyx

2
@rustyx, bu konumda ultra karmaşık bir "en az nitelikli isim bul" işlemini yürütmek istemeyen bir transpiler tarafından kodun mekanik olarak yeniden yayınlanmasıdır. FQ adı yaymak aramayı tamamen atlar ve bu tür araçlar için uygundur.
v.oddou

Yanıtlar:


10

Ayırt etmek için parantez koyabilirsiniz:

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

Gcc ve clang (her ikisi de -pedantic) ile test etsem de, parantez olmadan olmasa da, gerçekten hangi kuralın bu işi yaptığını söyleyemem . Sondaki dönüş türünü tercih ederim.


1
inanılmaz. gerçekten yapabiliriz. godbolt.org/z/KCFbJZ bu iğrenç ama harika. Tabii ki stil açısından takip harika. Ama benim durumumda, onu desteklemeyen bir lehçeyi hedefliyorum.
v.oddou
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.