Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在C++; 我试图编写一个C++模板类,它包含一个位数组(作为成员变量)。位数组的大小在编译时是已知的,所以我确实希望它是std::bitset,但是我很难编写操作符[]函数来设置位_C++_Arrays_Bitwise Operators_Std Bitset - Fatal编程技术网

如何在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;
};