2008-10-05 12 views
27

Podczas tworzenia biblioteki w konkretnej przestrzeni nazw, to często wygodne, aby zapewnić przeciążone operatory dla klas w tej przestrzeni nazw. Wydaje się (przynajmniej z g ++), że przeciążone operatory mogą być realizowane zarówno w przestrzeni nazw biblioteki:Przestrzenie nazw i operator Przeciążanie w C++

namespace Lib { 
class A { 
}; 

A operator+(const A&, const A&); 
} // namespace Lib 

lub nazw globalnego

namespace Lib { 
class A { 
}; 
} // namespace Lib 

Lib::A operator+(const Lib::A&, const Lib::A&); 

od moich testów, oboje wydają się działać dobrze. Czy jest jakaś praktyczna różnica między tymi dwiema opcjami? Czy podejście jest lepsze?

Odpowiedz

29

Należy je zdefiniować w przestrzeni nazw biblioteki. Kompilator znajdzie je mimo to poprzez wyszukiwanie zależne od argumentów.

Nie trzeba zanieczyszczać globalnej przestrzeni nazw.

+4

Innym powodem korzystania z nazw Biblioteka: [ten post] (http://stackoverflow.com/questions/5195512/namespaces-and-operator-resolution) zawiera przykład, w którym przy użyciu globalnej przestrzeni nazw nie działa. – Tim

2

Należy ją określić w przestrzeni nazw, zarówno dlatego, że składnia będzie mniej gadatliwy i nie zaśmiecać przestrzeni nazw globalnych.

Właściwie, jeśli zdefiniować przeciążeń w definicji klasy, to staje się dyskusyjna kwestia:

namespace Lib { 

class A { 
public: 
    A operator+(const A&); 
}; 

} // namespace Lib 
+1

To może być zły pomysł, ponieważ oznacza to, że jeśli B można niejawnie konwertowane do A, ale nie jest podklasą A, następnie A + B działa, ale B + A łudząco nie. Oczywiście to nie musi mieć znaczenia, na przykład, jeśli twój styl domu zakazuje niejawnej konwersji między typami zdefiniowanymi przez użytkownika. –

+1

Zgadzam się: istnieje problem, że A + B działa, ale nie B + A (np. A jest klasą symulującą liczbę zespoloną i B i int). Innym problemem jest to, że funkcje operatora nieprzyjaznego + zwiększają enkapsulację klasy, podczas gdy metoda klasy ją zmniejsza. – paercebal

15

wprowadzenie go do przestrzeni nazw biblioteki działa z powodu Koenig lookup.

+1

Rzeczywiście, przeglądarka Koeing została stworzona dokładnie tak, aby można było umieścić tę funkcję w przestrzeni nazw Lib i nadal mieć pewność, że jest przeciążona. Zobacz wyjątkowe elementy w C++ 31-32. – tenpn