2

我想使用移位运算符来进行位旋转,而不是它们的实际位移。这是我的预期行为:

std::bitset<8> b8("1010"); // b8 = 00001010 
b8 <<= 5;                  // b8 = 01000001

所以我尝试重载<<=运算符,引用bitset定义,如下所示:

#include <iostream>
#include <bitset>

using namespace std;

template <size_t size>
bitset<size>& bitset<size>::operator<< (size_t pos) noexcept { // an error at here

}

我在关键字处遇到错误operator

'operator<<' 的离线定义与 'bitset<_Size>' 中的任何声明都不匹配

我该如何解决?我的环境。是:

  • Xcode:版本 9.1 (9B55)
  • LLVM( llvm-g++ -v) :Apple LLVM 版本 9.0.0 (clang-900.0.38)
4

1 回答 1

1

std::bitset::operator<<=是模板类的成员函数std::bitset。您不能重新定义此运算符。你甚至不能用另一个隐藏它:

template <std::size_t size>
std::bitset<size>& operator<<=(std::bitset<size>& bitset, std::size_t count) noexcept {
    // ...
    return bitset;
}

这编译但什么也没做,因为当您编写时,在考虑您的自由功能之前会b8 <<= 5发现 unqualified-id 查找。std::bitset::operator<<=

您应该使用另一个运算符,定义一个rotate函数,或定义一个包装旋转类:

struct rotate
{
    rotate(std::size_t n) : value(n) {}
    std::size_t value;
};


template <std::size_t size>
std::bitset<size>& operator<<=(std::bitset<size>& bitset, rotate r) noexcept {
    bitset = bitset << r.value | bitset >> (size-r.value);
    return bitset;
}

用法:

std::bitset<8> b8("1010"); // b8 = 00001010 
b8 <<= rotate(5);          // b8 = 01000001

大肠杆菌演示

于 2017-11-23T10:30:40.133 回答