If there is an ambiguity with the namespace resolution, the 3.4/4.0 compiler
error message is very unclear while it was much better in 3.3 (and even 2.95):
% cat ns.cpp
namespace NsOut { namespace NsIn { struct Foo { }; } }
namespace NsIn { struct Foo { }; }
using namespace NsOut;
void foo(NsIn::Foo *);
% g++-3.3 -fsyntax-only -c ns.cpp
ns.cpp:7: error: use of `NsIn' is ambiguous
ns.cpp:3: error: first declared as `NsIn' here
ns.cpp:1: error: also declared as `NsOut::NsIn' here
ns.cpp:7: error: syntax error before `::' token
[ok so far]
% g++-3.4 -fsyntax-only -c ns.cpp
ns.cpp:7: error: `NsIn' has not been declared
ns.cpp:7: error: variable or field `foo' declared void
ns.cpp:7: error: `Foo' was not declared in this scope
ns.cpp:7: error: expected primary-expression before ')' token
[why "has not been declared"?]
% g++-4.0 -fsyntax-only -c ns.cpp
ns.cpp:7: error: 'NsIn' has not been declared
ns.cpp:7: error: variable or field 'foo' declared void
ns.cpp:7: error: 'Foo' was not declared in this scope
ns.cpp:7: error: expected primary-expression before ')' token
[same again]
The same problem occurs with a namespace alias, i.e. if you replace the line 3
of ns.cpp with "namespace NsIn = NsOut::NsIn;". While it's quite clear in this
example, it took a lot of time to find what the problem was in the real
program.
Tested with
gcc version 3.3.6 (Debian 1:3.3.6-10)
gcc version 3.4.5 (Debian 3.4.5-1)
gcc version 4.0.3 20051201 (prerelease) (Debian 4.0.2-5)
--
Summary: confusing error message for ambiguous namespaces
declarations
Product: gcc
Version: 4.0.3
Status: UNCONFIRMED
Severity: minor
Priority: P3
Component: c++
AssignedTo: unassigned at gcc dot gnu dot org
ReportedBy: vz-gcc at zeitlins dot org
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=26329