MyClass::f(); x.f(); p->f();
#include <iostream> #include <string> // ... std::string s("hello"); std::cout << s << std::endl;
std::operator<<(std::operator<<(std::cout,s),std::endl);
operator<<(std::cout, s);
(f)(x, y); // ADL suppressed
//: C05:Lookup.cpp // Only produces correct behavior with EDG, // and Metrowerks using a special option. #include <iostream> using std::cout; using std::endl; void f(double) { cout << "f(double)" << endl; } template<class T> class X { public: void g() { f(1); } }; void f(int) { cout << "f(int)" << endl; } int main() { X<int>().g(); } ///:~
Listado 6.34. C05/Lookup.cpp
f(double)
//: C05:Lookup2.cpp {-bor}{-g++}{-dmc} // Microsoft: use option -Za (ANSI mode) #include <algorithm> #include <iostream> #include <typeinfo> using std::cout; using std::endl; void g() { cout << "global g()" << endl; } template<class T> class Y { public: void g() { cout << "Y<" << typeid(T).name() << ">::g()" << endl; } void h() { cout << "Y<" << typeid(T).name() << ">::h()" << endl; } typedef int E; }; typedef double E; template<class T> void swap(T& t1, T& t2) { cout << "global swap" << endl; T temp = t1; t1 = t2; t2 = temp; } template<class T> class X : public Y<T> { public: E f() { g(); this->h(); T t1 = T(), t2 = T(1); cout << t1 << endl; swap(t1, t2); std::swap(t1, t2); cout << typeid(E).name() << endl; return E(t2); } }; int main() { X<int> x; cout << x.f() << endl; } ///:~
Listado 6.35. C05/Lookup2.cpp
global g() Y<int>::h() 0 global swap double 1