On Wednesday, 20 January 2016 at 05:32:08 UTC, Walter Bright
wrote:
Actual code examples of the serious problems would be
appreciated. All the namespace code examples you posted were
bugs that have since been fixed, or were misunderstandings that
were explained.
IMO his description was already quite clear, but here you are:
// a.d
module a;
extern(C++, ns) {
void fooa();
void bar();
}
// b.d
module b;
extern(C++, ns) {
void foob();
}
void bar();
// main.d
import a, b;
void main() {
fooa(); // ok
foob(); // ok
bar(); // Error: b.bar at b.d(6) conflicts with a.ns.bar
at a.d(5)
// let's try to disambiguate: we want ns.bar
ns.bar(); // Error: a.ns at a.d(3) conflicts with b.ns at
b.d(3)
a.ns.bar(); // works, but requires superfluous `a`, even
though
// `ns` already makes it unambiguous
}
Of course, it's because of how name lookup works in D, and we
understand that. But it still diminishes the usability of this
feature considerably, as the above situation is extremely likely
to run into if you're porting a sufficiently large C++ library.