2010-12-14 13 views
6

Tengo el siguiente fragmento de código:Llamar a una función sobrecargada en varios espacios de nombres desde el interior de un espacio de nombres

void foo(double a) {} 

namespace bar_space 
{ 
    struct Bar {}; 

    void foo(Bar a) {} 
} 

foo (doble) es una función general de una biblioteca. Tengo mi propio espacio de nombres bar_space con mi propia estructura, Bar. Me gustaría implementar una sobrecarga de foo() para Bar, lo que hace que Bar sea más similar a los tipos incorporados.

El problema aparece cuando intento llamar al foo originales (doble) desde el interior del espacio de nombres:

namespace bar_space 
{ 
    void baz() 
    { 
    foo(5.0); // error: conversion from ‘double’ to non-scalar type ‘ssc::bar_space::Bar’ requested 
    } 
} 

Esta falla al compilar el gcc en tanto mi Fedora y Mac.

Calling

foo(5.0) 

desde fuera del espacio de nombres o usar

namespace bar_space 
{ 
    ::foo(5.0) 
} 

funciona bien, pero ésto no hacer que mi nueva función es tan bonito como lo que esperábamos (otros desarrolladores también están trabajando en el interior bar_space).

¿Está bar_space ocultando la función original? ¿Hay alguna manera de hacer que foo (5.0) se llame desde dentro de bar_space sin un alcance explícito (: :)? Cualquier ayuda es apreciada.

+1

Soy un novato en C++, pero se puede usar algo como 'usando bar_space :: foo;'? – dreamlax

+0

Eso ayudará a usar foo (Bar) fuera de bar_space, pero no obtener foo (doble) en bar_space. –

+0

algo similar es posible: http://codepad.org/0IcNXZb6 – DaVinci

Respuesta

5

En C++, existe un concepto llamado name hiding. Básicamente, una función o nombre de clase está "oculta" si hay una función/clase del mismo nombre en un ámbito anidado. Esto evita que el compilador "vea" el nombre oculto.

Sección 3.3.7 de la norma de la C++ lee:

Un nombre puede estar oculto por un explícito declaración de ese mismo nombre en una región declarativa anidada o deriva clase (10.2)

lo tanto, para responder a su pregunta: en su ejemplo es void foo(double a); oculto por void bar_space::foo(Bar a); Así que hay que utilizar el operador :: alcance para invocar la función externa.

+0

no hay bar_space :: foo (doble) – DaVinci

+0

@DaVinci, corregido. –

+1

El estándar ha hablado, entonces. Gracias por la aclaración. –

1

Sí, bar_space se esconde la función original y no, no se puede hacer foo (5.0) que puede llamarse desde whithin bar_space sin alcance explícita si foo (doble) se define en el espacio de nombres global.

+0

Bien, usaré el :: entonces. No lo mencioné, pero foo() es realmente la función ceil() de math.h, por lo que se define en el espacio de nombres global. –

+0

@Christian - si incluye '' en su lugar (lo que debe hacer de todos modos), entonces 'ceil' se incluirá en el espacio de nombres' std', en cuyo caso su problema desaparecerá. –

+0

Acabo de hacer. El problema desapareció Y sí, debería haber usado todo el camino ... –

1

Sin embargo, en el código de ejemplo que podría utilizar algo así

namespace bar_space 
{ 
    using ::foo; 
    void baz() 
    { 
     Bar bar; 
     foo(5.0); 
     foo(bar); 
    } 
} 
+0

Iba a publicar esta respuesta y la probé y compiló bien para mí. (También me distrajeron las reuniones en el trabajo, etc.) – CashCow

Cuestiones relacionadas