2011-12-03 16 views
18
class Settings 
{ 
private: 
    typedef std::map<std::string, SettingsOption> OptionMap; 

public: 
    typedef OptionMap::iterator iterator; 
    typedef OptionMap::const_iterator const_iterator; 

    ... 
}; 

¿Este código es portátil? ¿Qué dice el estándar al respecto?¿Es portable el uso público de typedef privado?

Respuesta

24

Es legal y Settings::iterator y son accesibles para todos los usuarios de la clase Settings.

El control de acceso en C++ se aplica únicamente a los nombres. Hay una nota y un ejemplo en ISO/IEC 14882: 2011 11 [class.access]/4 que deja en claro que esta es la intención.

[...] [Nota: Debido a de control de acceso se aplica a los nombres, si el control de acceso es aplicado a un nombre typedef, sólo la accesibilidad del mismo nombre typedef se considera. La accesibilidad de la entidad a la que hace referencia typedef no se considera. Por ejemplo,

class A { 
    class B { }; 
public: 
    typedef B BB; 
}; 

void f() { 
    A::BB x; // OK, typedef name A::BB is public 
    A::B y; // access error, A::B is private 
} 

- nota final]

Cuestiones relacionadas