2012-01-21 2 views
3

я это следующий сценарийКак решить эту проблему с пространством имен?

namespace A { 
    //... 
    class A { 
     public: 
     static void foo(); 
    } 
    //... 
    } //namespace A 

При попытке получить доступ к Foo() из другого класса с A :: Foo() компилятор жалуется на «Foo не является членом», и когда я пытаюсь используйте A :: A :: foo(), он жалуется на неразрешенный внешний.

Как я могу это решить? Я думаю, что создание класса внутри одного и того же пространства имен довольно глупо и приводит к путанице, но я не автор кода, а изменение пространства имен или названия класса вызовет слишком много проблем.

+0

Возможный дубликат [Классы и пространства имен, имеющие одно и то же имя в C++] (http://stackoverflow.com/questions/4070915/classes-and-namespaces-sharing-the-same-name-in-c). –

+5

Ошибка в неразрешенном внешнем значении, что вы не реализовали 'A :: A :: foo()', а не синтаксис, неверно - на самом деле компилятор нашел то, что вы хотели! Вы реализовали, скомпилировали и связали в реализации 'foo'? – templatetypedef

+0

Ниже приведен пример использования 'A :: A :: foo()' с реализацией 'foo' в кодедексе: http://codepad.org/3muVCfgM –

ответ

3

вы можете использовать :: для перейдите в верхнюю часть иерархии пространства имен. Итак, ваш класс: A :: A

Редактировать: выше отвечает на ваш главный вопрос об пространствах имен. Но, как указывали другие, ваша проблема в том, что вы не определили foo. Добавить

inline void A :: A :: foo() {};

1

Вы хотите использовать полную квалификацию, то есть A::A::foo() (или даже ::A::A::foo(), если вы настаиваете на действительно полной квалификации). Дело в том, что функция нерешенным просто означает, что вы не определили его:

inline void A::A::foo() { ... } 

... или пропустить inline, если In't определений в файле заголовка.

BTW, я не покупаю ваш аргумент «вызывает слишком много проблем»: если что-то довольно глупо (т. Е. Члены вашей команды согласны с тем, что это неправильно), исправьте проблему скорее раньше, чем позже! Чем дольше вы будете ждать, тем больше проблем это вызовет, и чем больше проблем станет!

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