2010-11-04 5 views
3
void S(){} 
struct S{}; 

int main(){ 
    S(); 
} 

Dans le code ci-dessus, l'expression 'S()' dans main est traitée comme une expression d'appel de fonction plutôt que comme une tentative de création d'un type temporaire 'S'.Résolution d'ambiguïté

Quelle partie de la norme C++ parle de la résolution d'une telle expression en faveur d'une déclaration de fonction? Pour une raison quelconque, je suis incapable de le localiser.

Répondre

5

Section 3.3.7/2

Un nom de classe (9.1) ou le nom d'énumération (7.2) peuvent être cachés sous le nom d'un objet, la fonction, ou énumérateur déclaré dans la même portée. Si un nom de classe ou d'énumération et un objet, une fonction ou un énumérateur sont déclarés dans la même portée (dans n'importe quel ordre) portant le même nom, le nom de classe ou d'énumération est masqué partout où l'objet, la fonction ou le nom de l'énumérateur est visible.

Ensuite, vous devez utiliser spécificateur de type élaboré dans de tels cas

3.4.4/1 Type ÉLABORÉ spécificateurs

Un type élaboré spécificateur peut être utilisé pour désigner un nom de classe ou un nom enum déjà déclaré, même bien que le nom ait été masqué par une déclaration de type autre que le type (3.3.7). Le nom de classe ou le nom d'énumération dans le spécificateur de type élaboré peut être un identificateur simple ou être un identificateur qualifié.

+1

copain Eh oui C'est une Merci – Chubsdad

+0

@ Chubsdad: ':)' –

0

Il peut être résolu soit en utilisant l'opérateur de résolution de portée (... :) ou en utilisant le mot clé virtuel (lorsque nous traitons soit l'héritage multiple ou hybride