В соответствии с этим вопросом можно определить методы класса после директивы using
, а не включать их в блок namespace
.
Однако, похоже, это не относится к обычным функциям. Рассмотрим:
Greeting.hh
#pragma once
namespace NS
{
class Greeting
{
public:
void hello();
};
void otherHello();
}
Greeting.cc
#include "Greeting.hh"
#include <iostream>
using namespace NS;
void Greeting::hello()
{
std::cout << "Greeting::hello" << std::endl;
}
void otherHello()
{
std::cout << "otherHello" << std::endl;
}
main.cc
#include "Greeting.hh"
int main()
{
NS::Greeting o;
o.hello();
NS::otherHello();
}
Это не будет компилироваться, что приведет к следующему сообщению об ошибке:
undefined reference to `NS::otherHello()'
Дальнейшая проверка указывает, что символу otherHello
не предшествует пространство имен, а Greeting::hello
:
g++ -std=c++14 -pedantic -Wall -c Greeting.cc
nm -C Greeting.o | grep T
000000000000002a T otherHello()
0000000000000000 T NS::Greeting::hello()
Это противоречит стандартной ссылке из принятого ответа?
"При поиске неквалифицированного имени (3.4.1) имена отображаются так, как будто они были объявлены в ближайшем охватывающем пространстве имен, которое содержит оба директиву использования и назначенное пространство имен."