2009-10-22 3 views
0

J'ai un code existant construit avec compilateur C++ donnant l'erreur dans la ligne objetavertissement # 411: classe foo définit pas de constructeur pour initialiser les éléments suivants:

typedef struct foo { 
    char const * const str; 
} Foo; 

et beaucoup d'endroits dans le code (ce qui signifie Je ne peux pas changer tous) l'utiliser dans une initialisation de style C:

Foo arr[] ={ 
    {"death"}, 
    {"turture"}, 
    {"kill"} 
    } 

Quelle est la bonne solution pour supprimer l'avertissement stupide?

+3

Vous souhaiterez peut-être indiquer le compilateur qui émet cela. – sbi

+1

Utilisez-vous un compilateur C ou un compilateur C++? Quel est le résultat de 'printf ("% d \ n ", (int) sizeof 'a');' sur votre compilateur? – pmg

Répondre

0

Si cela fonctionne malgré tout, vous pouvez également désactiver l'avertissement dans la ligne de commande pour ces fichiers.

Avec gcc je pense que c'est quelque chose comme -wd411.

Pas si élégant, mais si cela fonctionne et si le code semble être conforme à la norme (dans cet ordre), il n'y a pas de raison de transpirer dessus!

2

Vous ne pouvez pas modifier le pointeur const après la construction. Vous avez besoin d'un initialiseur de constructeur pour initialiser 'str'.

struct Foo 
{ 
    const char* const str; 
    explicit Foo(const char* str_) : str(str_) {} 
}; 

Notez que 'typedef' n'est pas requis en C++ pour un cas comme celui-ci.

EDIT:

Si vous ne pouvez pas utiliser un constructeur, vous devez faire votre pointeur non-const:

struct Foo 
{ 
    const char* str; 
}; 

AUTRE EDIT:

Après le commentaire de litb, j'ai essayé le code original et compile en effet (g ++ 4.1.2 et XL C/C++ 8.0) sans avertissement. Peut-être que le compilateur en question fait une construction suivie d'une cession dans ce cas? J'ai utilisé des cordes moins violentes, mais je doute que cela fasse une différence. ; v)

+0

il ne traite pas le problème, parce que je ne peux pas définir un constructeur car il va casser le reste du code. – vehomzzz

+0

Que fait le explicite? 'Explicit' empêche la conversion implicite. – dicroce

+0

Par exemple, si vous aviez une fonction qui acceptait une référence const à Foo, vous ne pouviez pas lui passer un char * et créer un Foo implicitement créé. –

1

Vérifiez la documentation du compilateur pour voir s'il existe une solution de contournement. Votre code est parfaitement conforme, donc sans plus d'informations, il est impossible d'aider.

0

Le compilateur Intel l'a fait. Semble être un bug. L'astuce consiste à supprimer le second "const" de la structure.

Vous pouvez toujours créer le tableau const et cela empêchera la modification du pointeur. IE:

typedef struct foo { 
    char const * str; 
} Foo; 

const Foo arr[] ={ 
    {"death"}, 
    {"turture"}, 
    {"kill"} 
} 
Questions connexes