2014-09-27 3 views
0

Я пишу библиотеку с содержимым:C++: переопределять ли текущее пространство имен других пространств имен

namespace david { 
    typedef enum { 
    BAR 
    } CommonEnum; 

    class Foo { 
    void fooBar() { 
     std::cout << BAR << std::endl; 
    } 
    } 
} 

и давайте предположим, что пользователь записывает файл

typedef enum { 
    BAR = 1 
} CommonEnum; 

#include <david.h> 

Foo myFoo(); 

myFoo.fooBar(); 

Что будет напечатано? Если будет напечатано 0, то надежный? Я знаю, что мог бы просто префикс моего использования BAR в david::Foo так, чтобы он читал david::BAR, и это точно ответит на вопрос (это то, что я сейчас делаю), но оно становится довольно многословным, и я пытаюсь придерживаться 80 -character limit, что означает, что мой код становится все труднее читать.

+0

* «Что будет напечатано?» * - Вопрос назад: что * * был напечатан, когда вы пробовали это? Это единственный вопрос, или вы ищете цитату из стандарта, которая устраняет любые сомнения в том, что то, что вы стали свидетелями, является окончательным? – WhozCraig

+0

Сначала он будет жаловаться на недостающую точку с запятой в определении Foo, тогда он скажет вам, что «Foo' не был объявлен в этой области», а затем, когда вы исправляете это, «запрос для члена' fooBar' в ' myFoo', который является неклассовым типом 'david :: Foo()' ", и, наконец, он будет жаловаться, что' fooBar' является закрытым. –

ответ

0

Имея класс Foo и перечисление BAR в namespace david

void fooBar() { 
    std::cout << BAR << std::endl; 
} 

рассосется BAR к внутренней применимый. Таким образом

typedef enum { 
    BAR = 1 
} CommonEnum; 

не будет "переопределить" определение от namespace david.

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