我正在尝试编写一个包含位数组(作为成员变量)的C ++模板类。位数组的大小在编译时是已知的,所以我真的希望它是std::bitset
,但我很难将operator[]
函数写入设置位。
例如,我希望我的班级能够开始这样的事情:
template<size_t N>
class bitvector
{
public:
bool operator[](size_t i) const { return bits[i]; }
bool& operator[](size_t i) { return bits[i]; }
private:
std::bitset<N> bits;
};
getter工作正常。问题是std::bitset::operator[]
setter函数返回std::bitset::reference
(不是bool&
),它本身就是模板化的。我对模板不太熟悉,但以下尝试失败了:
template<size_t K>
std::bitset<K>::reference operator[](size_t i) { return bits[i]; }
出现以下错误need 'typename' before 'std::bitset<K>::reference' because 'std::bitset<K>' is a dependent scope
。我尝试了一些谷歌搜索,但无济于事。
std::bitset
是否适合执行此任务?如果是这样,我该如何编写setter函数?如果没有,我可以使用什么呢? (我仍然希望它实际存储为位,而std::vector<bool>
看起来并不正确,因为我希望在编译时严格修复数组大小。)
答案 0 :(得分:3)
您可以按如下方式返回template<size_t N>
class bitvector
{
public:
bool operator[](size_t i) const { return bits[i]; }
typename std::bitset<N>::reference operator[](size_t i) { return bits[i]; }
private:
std::bitset<N> bits;
};
:
template<size_t K>
由于您仍然可以访问原始模板参数N,因此不需要额外的typename
,在任何情况下您都不希望N和您的K不同。
在函数返回类型之前需要::reference
告诉编译器struct Foo{
typedef int reference;
};
struct Bar{
static int reference;
};
是一个类型而不是一个值。
例如:
Foo::reference
此处Bar::reference
是一种类型,但typename
是一个变量,在编译器将抱怨的返回类型之前没有std::bitset<N>::reference
,因为{{1}}可能是{{1}}变量。 (编译器应该具有所需的所有信息,以确定它不是一个值,但出于某种原因它仍然是必需的。)