2013-04-11 5 views
4
#include<iostream> 
using namespace std; 
class Foo { 
void Bar(void) const ; 
}; 
int main() 
{ 
    Foo f; 
    cout<<sizeof(f)<<endl; 
} 

J'ai couru ceci sur g ++, il ne m'a donné aucune erreur de compilation. En outre, il a exécuté en donnant o/p 1 qui est correct. Mais je m'attendais, erreur lors de la liaison. Ce compilateur est-il dépendant?pourquoi compiler le code suivant

+3

Pourquoi vous attendiez-vous à une erreur de l'éditeur de liens? –

+0

Peut-être parce que 'Foo :: Bar' n'est pas défini. – filmor

+1

@filmor Et voyez-vous un endroit où il est utilisé (c'est-à-dire appelé ou son adresse est prise)? –

Répondre

11

Je peux seulement imaginer que vous vous attendiez à recevoir une erreur car Foo::Bar n'est pas défini. La règle de définition unique de la norme requiert uniquement que les éléments utilisés soient définis. Dans votre cas particulier, rien dans votre programme n'utiliseFoo::Bar, donc le programme n'a pas besoin de cette définition.

+0

J'aime mieux votre réponse que la mienne. – diverscuba23

+0

oui ... appeler Bar() donne une erreur. Mais je n'étais pas au courant de la dépendance. D'ailleurs, est-ce dans la norme? – rahul

+0

@rahul Au moins ... Lire la réponse! "La règle de définition unique dans la norme" ... –

3

Cela va lier car il n'y a pas de références en cours à Foo :: Bar, et là pour sa définition n'est pas nécessaire. Si vous aviez essayé de faire un appel tel que f.bar(), cela vous aurait donné l'erreur.

+0

Une autre façon d'obtenir une erreur de l'éditeur de liens est de rendre Bar() virtuel. – jszpilewski

3

Il n'y a pas d'erreur de lien, car toutes les dépendances sont résolues.

Dès que vous appelez la méthode Bar() et que vous ne le définissez pas, vous obtenez une erreur de l'éditeur de liens. Parce que vous référencez Bar() et l'éditeur de liens ne peut pas le résoudre.

Questions connexes