我想使用移位运算符进行位旋转而不是它们的实际位移。这是我预期的行为:
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
处遇到错误:
Out-of-line definition of 'operator<<' does not match any declaration in 'bitset<_Size>'
我该如何解决?我的环境。是:
- 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
关于c++ - 重载 std::bitset 的移位运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47452703/