# gcc --version gcc (Ubuntu 4.4.3-4ubuntu5) 4.4.3 3 source files: ns1.h ns2.h test.cpp --------------------------------------------------------- ns1.h: #pragma once class A { }; --------------------------------------------------------- ns2.h: #pragma once class A { }; --------------------------------------------------------- test.cpp: namespace NS1 { #include "ns1.h" } namespace NS2 { #include "ns2.h" } int main() { NS2::A a; return 0; } --------------------------------------------------------- # touch * // important step, let ns1.h and ns2.h have same modification time # gcc test.cpp test.cpp: In function 'int main()': test.cpp:11: error: 'A' is not a member of 'NS2' test.cpp:11: error: expected ';' before 'a' # gcc -c -E test.cpp # 1 "test.cpp" # 1 "<built-in>" # 1 "<command-line>" # 1 "test.cpp" namespace NS1 { # 1 "ns1.h" 1 class A { }; # 4 "test.cpp" 2 } namespace NS2 { } int main() { NS2::A a; return 0; } ---------------------------------------------------- The NS2::A declaration isn't included in namespace NS2
this has nothing to do with namespace scope, it's #pragma once confusing two separate files as one
You either should have different content of the two headers, or don't use #pragma once, or you need to have different timestamps. In order to support symlinks/hardlinks and also lame filesystems that lack them, the preprocessor only looks at file sizes/timestamps and content if there are multiple #pragma once (or #import) headers.
If you want to use #pragma once the simplest solution might be to put a unique comment in each file, with e.g. just the filename, or a description of its purpose