При реализации cpp для пространств имен я не делаю "использование имени пространства имен"; вещь. Вместо этого я объявляю пространство имен, как в файле .h, и встраиваю весь код пространства имен в него. Вот так:
namespace Namespacename {
classname::methodname () { ... };
...etc.
}
Это позволяет избежать путаницы, как для вас, так и для компилятора.
Итак, ваш код должен выглядеть так:
#include "test.h"
namespace TestNamespace {
void TestClass::setValue(int &aI)
{
i=aI;
}
int TestClass::value()
{
return i;
}
void testFunc(TestClass &myObj)
{
int j = myObj.i;
}
}
Как правило, я стараюсь избегать «использования» в целом. Вероятно, это приемлемо для "std", но для всего остального я хочу, чтобы читатель знал , откуда взялись вещи. Это не так уж сложно, если вы придерживаетесь позиции, что пространство имен должно быть частью имени объекта, когда вы называете вещи.
Например, в приведенном выше коде я назову пространство имен «Тест» и исключу слово «Тест» из всех его методов и классов. Таким образом, вместо выполнения using TestNamespace;
и объявления TestClass
ваш клиент просто объявит Test::Class
. Таким образом, Test на самом деле является частью навязанной компилятором структуры для ваших объектов, а не просто частью неструктурированных метаданных, которые вы должны поместить в начало своих имен, чтобы подразумевать отношения.