在嵌套 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)
{
}
};
};
我有以下 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)
{
}
};
};