O que significa?

92

Eu tenho 2 aulas:

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

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

Cometi um erro e escrevi em base:foo();vez de base::foo();. O código foi compilado e executado, mas com falha de segmento.

Não sei como posso pesquisar no Google e não sei o que é, mas estou muito interessado: o que isso significa?

base:foo();

Se for importante:

class base : public QAbstractGraphicsShapeItem
Railmisaka
fonte
32
É um rótulo .
chris de
20
Este é um caso em que ativar os avisos ajuda, veja ao vivo ... warning: label 'base' defined but not used [-Wunused-label]... talvez precisemos adicionar esta página de fazer uma pergunta: Você já tentou ativar os avisos
Shafik Yaghmour
6
Isso terminou com um estouro de pilha. Quão apropriado!
Laurent LA RIZZA

Respostas:

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

é equivalente a:

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

Devido à recursão infinita, a função causa estouro de pilha.

R Sahu
fonte
1
sim, eu encontrei esse erro quando vi muitas chamadas de foo()na pilha de chamadas. obrigado
railmisaka
há avisos para isso disponíveis em gcc / clang etc.?
nonsensation
10
@Serthy, Quando eu uso -Wall, recebo a mensagem de aviso: socc.cc:3:4: aviso: rótulo 'base' definido, mas não usado [-Wunused-label] base: // Um ​​rótulo não usado.
R Sahu
10
@Serthy: IIRC Visual Studio tem o aviso "recursivo em todos os caminhos de controle" para isso.
MSalters