重载 std::bitset 的移位运算符
Overload the shift operators of 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
处遇到错误:
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<<=
是模板classstd::bitset
的成员函数。您不能重新定义此运算符。你甚至不能用另一个隐藏它:
template <std::size_t size>
std::bitset<size>& operator<<=(std::bitset<size>& bitset, std::size_t count) noexcept {
// ...
return bitset;
}
这可以编译但没有任何效果,因为当您编写 b8 <<= 5
时,不合格 ID 查找会在考虑您的自由函数之前找到 std::bitset::operator<<=
。
您应该使用另一个运算符,定义一个 rotate
函数,或者定义一个包装器 rotate class:
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
我想使用移位运算符进行位旋转 而不是 它们的实际位移。这是我预期的行为:
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<<=
是模板classstd::bitset
的成员函数。您不能重新定义此运算符。你甚至不能用另一个隐藏它:
template <std::size_t size>
std::bitset<size>& operator<<=(std::bitset<size>& bitset, std::size_t count) noexcept {
// ...
return bitset;
}
这可以编译但没有任何效果,因为当您编写 b8 <<= 5
时,不合格 ID 查找会在考虑您的自由函数之前找到 std::bitset::operator<<=
。
您应该使用另一个运算符,定义一个 rotate
函数,或者定义一个包装器 rotate class:
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