Exceptional C++

【Exceptional C++(18)】接口原则

2018-01-30  本文已影响10人  downdemo
class X { ... };
void f(const X&); // f是X的一部分吗?

// 如果上面的代码出现在一个头文件中
class X {
public:
    void f() const; // f是X的一部分吗?
}
class X { ... };
ostream& operator<<(ostream&, const X&);
namespace NS {
    class T {};
    void f(T);
}
NS::T parm;
int main() {
    f(parm); // call NS::f
}
#include <iostream>
#include <string>
int main() {
    std::string hello = "hello, world";
    std::cout << hello; // call std::operator<<
}
namespace NS {
    class T {};
}
void f(NS::T);
int main() {
    NS::T parm;
    f(parm); // call global f
}
namespace NS {
    class T {};
    void f(T); // new function
}
void f(NS::T);
int main() {
    NS::T parm;
    f(parm); // ambiguous: call NS::f or global f?
}
namespace A {
    class X {};
}
namespace B {
    void f(A::X);
    void g(A::X parm) {
        f(parm); // call B::f
    }
}
// 增加一个函数
namespace A {
    class X {};
    void f(X); // new function
}
namespace B {
    void f(A::X);
    void g(A::X parm) {
        f(parm); // ambiguous: call A::f or B::f
    }
}
namespace A {
    class X {};
    ostream& operator<<(ostream&, const X&);
}
namespace B {
    ostream& operator<<(ostream&, const A::X&);
    void g(A::X parm) {
        cout << parm; // ambiguous: A::operator<< or B::operator<< ?
    }
}
namespace A {
    class X { };
    void f(X);
}
class B { // class, not namespace 
    void f(A::X);
    void g(A::X parm) {
        f(parm); // call B::f
    }
};
// file a.h
namespace N { class B; }
namespace N { class A; }
class N::A { public: void g(B); };
// file b.h
namespace N { class B { ... }; }
上一篇下一篇

猜你喜欢

热点阅读