Re[3]: Перегрузка operator&
От: rg45 СССР  
Дата: 09.02.19 09:57
Оценка: 6 (1)
Здравствуйте, Videoman, Вы писали:

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


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

V>
  ccode
V>
V>#include <iostream>

V>using namespace std;

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

V>namespace my
V>{
V>using namespace impl;

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

V>template<int size>
V>class A 
V>{
V>};

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

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

V>} // namespace my

V>namespace my2
V>{
V>    using namespace impl;

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

V>int main() 
V>{    
V>    return 0;
V>}
V>



Ну так ответ здесь: http://rsdn.org/forum/cpp/7369795.1
Автор: koenjihyakkei
Дата: 08.02.19
. Используй using-declaration вместо using-directive:

   using impl::operator&;
--
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.