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

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出现错误:



我该如何解决?我的环境是:
  • Xcode:版本9.1(9B55)
  • LLVM(llvm-g++ -v):Apple LLVM版本9.0.0(clang-900.0.38)
  • 最佳答案

    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

    关于c++ - 重载std::bitset的移位运算符,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47452703/

    10-12 07:10