[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [bug-cgicc] namespace bug
From: |
AIDA Shinra |
Subject: |
Re: [bug-cgicc] namespace bug |
Date: |
Sun, 13 Jul 2003 21:10:13 +0900 |
On 2003.7.12, at 04:23 AM, Volker Wysk wrote:
Hello
In MStreamable.h, the following is defined inside the cgicc namespace:
CGICC_API STDNS ostream&
operator<<(STDNS ostream& out, const MStreamable& obj);
Thus, when using "using namespace cgicc;", and not using "using
namespace
std" this operator<< shadows any other operator<<'s, even for different
argument types. That's is the normal C++ name finding procedure.
No. What is your compiler? It does not seem to support Koenig lookup
properly.
For example,
namespace ns1 {
struct Type1 {};
void foo(Type1, Type1) {}
}
namespace ns2 {
struct Type2 : ns1::Type1 {}:
void foo(Type1, Type2) {}
}
using namespace ns1;
int main(int, const char *const *) {
foo(Type1(), ns2::Type2());
return 0;
}
First both ns1::foo() and ns2::foo() are choosed as foo()'s canditates.
Then normal
overload solution is performed. Then ns2::foo() is invoked. Therefore,
The operator<< should be defined outside any namespaces.
No. Operators should be defined inside corresponding namespaces to
their arguments.
If you define them in the global namespace, real hiding problems occur.
namespace ns1 {
struct Type1 {};
}
void foo(Type1) {}
namespace ns2 {
struct Type2 {};
void foo(Type2) {}
template <class T>
void bar(T t) {
foo(t);
}
}
int main(int, const char *const *) {
ns2::bar(ns1::Type1()); // does not compile
return 0;
}
From ns2::bar<ns1::Type1>() only ns2::foo() is visible. To avoid this
problem you need to
define foo(Type1) inside ns1. Then Koenig lookup finds both of foo()s.