Ne anlama geliyor?


92

2 sınıfım var:

class base {
    virtual void foo() {};
};

class derived : public base {
    void foo() { base::foo(); }
};

Bir hata yaptım ve base:foo();yerine yazdım base::foo();. Kod derlendi ve çalıştırıldı, ancak ayrıldı.

Nasıl Google'a atabileceğimi bilmiyorum ve ne olduğunu bilmiyorum ama çok ilgileniyorum: bu ne anlama geliyor?

base:foo();

Eğer önemliyse:

class base : public QAbstractGraphicsShapeItem

32
Bu bir etiket .
chris

20
Bu, uyarıları açmanın yardımcı olduğu, canlı göründüğü bir durumdur ... warning: label 'base' defined but not used [-Wunused-label]... belki bunu bir soru sor sayfasına eklememiz gerekir: Uyarıları
açmayı

6
Bu, yığın taşmasıyla sona erdi. Ne kadar uygun!
Laurent LA RIZZA

Yanıtlar:


125
void foo() { base:foo(); }

eşdeğerdir:

void foo()
{
   base: // An unused label.
   foo(); // Calls the function again, resulting in infinite recursion.
}

Sonsuz özyineleme nedeniyle, işlev yığın taşmasına neden olur.


1
evet, foo()çağrı yığınında birçok çağrı gördüğümde bu hatayı buldum . teşekkürler
railmisaka

bunun için gcc / clang vb. olarak mevcut uyarılar var mı?
nonsensation

10
@Serthy, Kullandığım zaman -Wallşu uyarı mesajını alıyorum: socc.cc:3:4: uyarı: "base" tanımlı ama kullanılmayan [-Wunused-label] base: // Kullanılmayan bir etiket.
R Sahu

10
@Serthy: IIRC Visual Studio bunun için "tüm kontrol yollarında özyinelemeli" uyarısına sahiptir.
MSalters
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.