2015-10-20 7 views
8
namespace nm 
{ 
    class C1 {}; 
    class C2 {}; 
    inline std::ostream& operator << (std::ostream& lhs, std::vector<C1> const&) { return lhs; } 
    inline std::ostream& operator << (std::ostream& lhs, std::vector<C2> const&) { return lhs; } 
} 

using nm::operator<<; 

Czy istnieje sposób, aby zadeklarować, że używa tylko jednego z operators << od nazw nm w globalnej jeden, a nie jedno i drugie?użyciu deklarację dla betonu operatora wyjściowego (z podpisem betonowej)

+0

Jaki jest użycie 'using' deklaracji? –

+0

'using ns_name :: name' using-declaration powoduje, że nazwa symbolu z przestrzeni nazw ns_name jest dostępna dla niewykwalifikowanego wyszukiwania tak, jakby była zadeklarowana w tym samym zasięgu klasy, zasięgu bloku lub przestrzeni nazw, tak jak w przypadku gdy ta deklaracja użycia pojawia się –

+0

Dlaczego chcesz Zrób to. Jaki jest Twój cel? –

Odpowiedz

3

Jednym rozwiązaniem byłoby umieścić każdy operator<< we własnej przestrzeni nazw zagnieżdżonych:

namespace nm 
{ 
    class C1 {}; 
    class C2 {}; 
    namespace nm1 { 
    inline std::ostream& operator << (std::ostream& lhs, C1 const&) { return lhs; } 
    } 
    namespace nm2 { 
    inline std::ostream& operator << (std::ostream& lhs, C2 const&) { return lhs; } 
    } 
} 

using nm::nm1::operator<<; 

LIVE DEMO

+1

Jeśli nie mogę zmienić kodu nm? –

+0

Jednym z nich może być 'inline'. – edmz

+0

Jeśli masz kontrolę nad kodem, możesz również umieścić deklarację użycia pomiędzy dwoma blokami 'namespace nm {...}' i zadeklarować inny 'operator <<' w drugim bloku. –

Powiązane problemy