如何在C++; 我试图编写一个C++模板类,它包含一个位数组(作为成员变量)。位数组的大小在编译时是已知的,所以我确实希望它是std::bitset,但是我很难编写操作符[]函数来设置位
例如,我想让我的班级从这样开始:如何在C++; 我试图编写一个C++模板类,它包含一个位数组(作为成员变量)。位数组的大小在编译时是已知的,所以我确实希望它是std::bitset,但是我很难编写操作符[]函数来设置位,c++,arrays,bitwise-operators,std-bitset,C++,Arrays,Bitwise Operators,Std Bitset,例如,我想让我的班级从这样开始: 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; }; 出现以下错误时,需要在“std::bitset::re
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;
};
出现以下错误时,需要在“std::bitset::reference”之前加上“typename”,因为“std::bitset”是一个从属作用域
。我尝试了一些谷歌搜索,但没有用
std::bitset
是否适合此任务?如果是,如何编写setter函数?如果没有,我可以用什么来代替?(我仍然希望它实际存储为位,并且std::vector
似乎不太正确,因为我希望数组大小在编译时严格固定)。您只需返回std::bitset::reference
,如下所示:
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;
};
这里
Foo::reference
是一个类型,但是Bar::reference
是一个变量,如果在返回类型之前没有typename
,编译器会抱怨std::bitset::reference
是一个变量。(编译器应该拥有它所需要的所有信息,以确定它不是一个值,但出于某种原因,它是必需的)。我不明白。std::bitset
,那么为什么要重新发明轮子呢?似乎错误是不言自明的。在…之前添加typename
。那么你为什么不试一下呢?@ThomasMatthews:可能是一个更大类的最小版本来演示这个问题。@ThomasMatthews在另一篇评论中指出,我试图从一个更大的类中给出一个最小的例子。@NowhereMan,当然,我试过了,但它产生了一系列新的错误,似乎把我引向了错误的方向。很好的答案。非常感谢你解释得这么清楚。
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;
};
struct Foo{
typedef int reference;
};
struct Bar{
static int reference;
};