Member functions declared in nested classes can be defined in file scope. The preceding example could have been written:
class BufferedIO
{
public:
enum IOError { None, Access, General };
class BufferedInput
{
public:
int read(); // Declare but do not define member
int good(); // functions read and good.
private:
IOError _inputerror;
};
class BufferedOutput
{
// Member list.
};
};
// Define member functions read and good in
// file scope.
int BufferedIO::BufferedInput::read()
{
...
}
int BufferedIO::BufferedInput::good()
{
return _inputerror == None;
}
In the preceding example, the qualified-type-name syntax is used to declare the function name. The declaration:
BufferedIO::BufferedInput::read()
means “the read function that is a member of the BufferedInput class that is in the scope of the BufferedIO class.” Because this declaration uses the qualified-type-name syntax, constructs of the following form are possible:
typedef BufferedIO::BufferedInput BIO_INPUT;
int BIO_INPUT::read()
The preceding declaration is equivalent to the previous one, but it uses a typedef name in place of the class names.