2014-01-17 3 views
1

У меня есть объявление класса так:Определение класса в пространстве имен

// bar.h 
namespace foo { 
    class bar { 
     // members both public and private 
    } 
} 

Когда я определить класс, я хотел бы сделать это

// bar.cpp 
namespace foo::bar { 
    // member definitions 
} 

Вместо

namespace foo { 
    bar::x() {} 
    bar::y() {} 
    bar::z() {} 
} 

Но я не могу. Почему это? Я думал, что классы объявили пространства имен, но я должен ошибаться. Должен ли оператор области действия разрешать область пространства имен, а затем область класса?

Я спрашиваю, потому что в любое время, когда у вас есть имя класса нетривиальной длины, он может стать очень повторяющимся для повторного ввода имени класса, особенно если у него более нескольких членов. Может быть, это похоже на то, чтобы люди определяли интерфейсы небольших классов.

+0

Вам не хватает закрывающего ';' вашего определения 'bar'. – ChiefTwoPencils

ответ

2

Почему это? Я думал, что классы объявили пространства имен, но я должен ошибаться

Вы ошибаетесь. :)

Не должен ли оператор области действия разрешать область пространства имен, а затем область класса?

Язык не будет поддерживать это, но это просто не так.

Вероятно потому, что он может получить немного запутанным, и потому, что следующий будет откровенная ложь:

class bar { 
    void x(); 
    void y(); 
    void z(); 
}; 

namespace bar { 
    void x() {} 
    void y() {} 
    void z() {} 
} 

Действительно, аналогия с такого рода «встроенных определений», которые вы можете сделать с пространствами имен, является встроенные определения функций-членов:

class bar { 
    void x() {} 
    void y() {} 
    void z() {} 
}; 
2

Во-первых, ваше объявление класса нуждается в ; после него:

namespace foo 
{ 
    class bar 
    { 
     // members both public and private 
    }; // error without this 
} 

При реализации класса (не-инлайн), вы можете сделать это двумя способами:

void foo::bar::x() 
{ 
    // function definition 
} 

или

namespace foo 
{ 
    void bar::x() 
    { 
     // function definition 
    } 
} 

Обратите внимание, что bar класс, не пространство имен.

Смежные вопросы