重载std :: bitset的移位运算符

时间:2017-11-23 10:04:34

标签: c++ operator-overloading std-bitset

我想使用移位运算符作为实际位移的一点旋转而不是。这是我的预期行为:

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&lt;&lt;'的外线定义与'bitset&lt; _Size&gt;'

中的任何声明都不匹配

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

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

1 个答案:

答案 0 :(得分: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

demo on coliru