在嵌套 class 中使用模板值

Using template value inside nested class

我有以下 class 定义:

template <int B>
class SparseBitvector
{
    typedef typename std::vector<std::bitset<B>> BitsetVector;

public:
    class iterator: public std::iterator<...>
    {
        public:
            explicit iterator(..., BitsetVector::iterator* _chunksIt, ...) {...}
    }
}

编译时我得到这个错误:

/project/powerset/src/powerset/sparse_bitvector.h:96:125: error: 'std::BitsetVector<std::bitset<(long unsigned int)B>, std::allocator<std::bitset<(long unsigned int)B> > >::iterator' is not a type
         explicit iterator(SortedStaticSet<EHRule> *_offsets, std::vector<std::bitset<B>> *_chunks, SetElement* _offssetsIt, BitsetVector::iterator* _chunksIt, int _indInBitset)

是否允许在嵌套 class 中使用模板值?

如果不是,我是否犯了其他错误?

您需要使用 typename keyword for depended types。这里举例

typename BitsetVector::iterator* _chunksIt
//^^^^^^

其次,模板类型别名

不需要typename
typedef std::vector<std::bitset<B>> BitsetVector;
// or better use
// using BitsetVector = std::vector<std::bitset<B>>;

上面的最小例子考虑如下:

#include <vector>
#include <iterator>
#include <bitset>

template <int B>
class SparseBitvector
{
   typedef std::vector<std::bitset<B>> BitsetVector;

public:
   class iterator : public std::iterator<std::input_iterator_tag, BitsetVector>
   {
   public:
      explicit iterator(std::input_iterator_tag, BitsetVector, typename BitsetVector::iterator* _chunksIt)
      {
      }
   };
};