[C++] 네임스페이스 질문!

gurumong의 이미지

제가 가진 책의 예제코드를 참조해서 컴파일 가능한 코드를 짰는데요
책의 설명대로라면 main함수내에서 참조하는 f는 네임스페이스 A에서 선언한 변수여야하는데
실제 컴파일에서는 에러가 나더라구요
책이 잘못된 것일까요?

#include <iostream>
 
namespace A {
  double f;       // ★
}
 
char f;            // ★
 
int main()
{
  using namespace A;
  std::cin >> f; // ★
  std::cout << f << std::endl;
}

$ g++ -Wall -W -o ex ex.cpp
ex.cpp: In function `int main()':
ex.cpp:12: error: `f' undeclared (first use this function)
ex.cpp:12: error: (Each undeclared identifier is reported only once for each function it appears in.)

실제 책의 코드 입니다.

namespace Jill {
  double bucket(double n) { ... }
  double fetch;            // ★
  struct Hill { ... };
}
char fetch;                  // ★전역 이름 공간
int main()
{
  using namespace Jill;     // 그 이름 공간의 모든 이름을 불러 온다
  Hill Thrill;              // Jill::Hill 구조체를 생성한다
  double water = bucket(2); // Jill::bucket();를 사용한다
  double fetch;             // ★허용된다, Jill::fetch를 가린다 << 의심스러운 부분!!!
  cin >> fetch;             // 값을 지역 fetch에 저장한다
  cin >> ::fetch;           // 값을 전역 fetch에 저장한다
  cin >> Jill::fetch;       // 값을 Jill::fetch에 저장한다
    ...
}
kwchun의 이미지

컴파일러가 메인 안에서 어떤 f를 써야 할지 알 수 없어서 발생하는 문제입니다. 이름공간 A 안의 f를 쓴다면 A::f를, 전역변수 f를 사용한다면 ::f를 써주세요.