Можно ли обойти Koenig Lookup?
От: nen777w  
Дата: 09.03.16 16:02
Оценка:
Добрый час возможно?

Код:
namespace nsA { namespace nsB {
        
        enum class MyEnum
        {
            None = 0,
            AA = 0x01,
            BB = 0x02,
        };

}}

template<class T> inline nsA::nsB::MyEnum operator&(nsA::nsB::MyEnum a, T b) 
{ 
    return nsA::nsB::MyEnum::None;
} 

template<class T> inline bool operator!=(nsA::nsB::MyEnum a, T b) 
{ 
    return true;
} 

namespace nsA { namespace nsB {
        
        class CDoo {};
        bool operator !=(CDoo x, CDoo y) { return 0; }
}}

namespace nsA { namespace nsB {

        class CFoo  {};
        bool operator != (CFoo a, CFoo b) { return 0; }

}}



namespace nsA { namespace nsB {


void foo()
{
    nsA::nsB::MyEnum ff0 = nsA::nsB::MyEnum::BB;
    nsA::nsB::MyEnum ff = ff0 & nsA::nsB::MyEnum::BB;
    bool b = operator != (ff, 0); //<-- при такой форме записи можно ::operator (но такое лучше не предлагать)
    bool b1 = ff != 0; //<-- А здесь я вообще понимаю что просто никак.
}

}}


Ну а по факту понятно что компилятор даже не пытается заглянуть в глобальное пространство имён для поиска нужного оператора.
Отредактировано 09.03.2016 16:04 nen777w . Предыдущая версия .
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.