Re[2]: Перегрузка operator&
От: Videoman Россия https://hts.tv/
Дата: 09.02.19 09:50
Оценка:
Здравствуйте, rg45, Вы писали:

R>Так он и разрешается только для воплощений шаблонного класса A. А для перечислений En не разрешается, поэтому и возникает ошибка компиляции. Я полагаю, это очевидно и без ссылок на конкретные пункты стандарта, не так ли? А вот как должно выглядеть диагностическое сообщение об ошибке — этого в стандарте, конечно же нет, оно может иметь различную форму у разных компиляторов. Понятно, что разработчики компиляторов стараются сделать сделать свои диагностические сообщения максимально полезными и понятными. Ну а получается уже как получается.


Не совсем. Вот тут я попытался обозначить проблему. Оператор& класса A<size> маскирует оператор& Enum-а. Если его убрать, то все ок.
#include <iostream>

using namespace std;

namespace impl
{
    template<typename Enum, class = decltype(enable_bitmask_operators(*(Enum*)nullptr))>
    inline Enum operator&(Enum left, Enum right)
    {
        using Underlying = std::underlying_type_t<Enum>;
        return static_cast<Enum>(static_cast<Underlying>(left) & static_cast<Underlying>(right));
    }
}

namespace my
{
using namespace impl;

enum class Enum : int { a, b, c };
void enable_bitmask_operators(Enum);

template<int size>
class A 
{
};

//template<int size>                      // Если это раскомментраить то то перестает компилироваться
//A<size> operator&(const A<size>&, const A<size>&);    // Если это раскомментраить то то перестает компилироваться

void func()
{
    Enum en1 = Enum::a;
    Enum en2 = Enum::b;
    Enum en3 = Enum::a & Enum::b;
}

} // namespace my

namespace my2
{
    using namespace impl;

    my::Enum en3 = my::Enum::a & my::Enum::b;
} // namespace my2

int main() 
{    
    return 0;
}
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.