我想实现一个简单的本机C ++固定容量数组模板类,为方便起见,支持基于范围的“for each”语法,并且开销最小。
我在const实例上支持它时遇到了麻烦。
有了这个实现:
template< class T, size_t Capacity >
class List
{
public:
List() { mSize = 0; }
const T* begin() const { return mItems; }
const T* end() const { return mItems + mSize; }
T* begin() { return mItems; }
T* end() { return mItems + mSize; }
private:
size_t mSize;
T mItems[ Capacity ];
};
这个用法:
const List< int, 5 > myInts;
for each( const int myInt in myInts )
{
continue;
}
我收到此错误:
error C2440: 'initializing' : cannot convert from 'const int *' to 'int *'
Conversion loses qualifiers
此用法不会抱怨:
List< int, 5 > myInts;
for each( const int myInt in myInts )
{
continue;
}
这种(不受欢迎的)实施不会抱怨:
template< class T, size_t Capacity >
class List
{
public:
List() { mSize = 0; }
T* begin() const { return const_cast< List* >( this )->mItems; }
T* end() const { return const_cast< List* >( this )->mItems + mSize; }
private:
size_t mSize;
T mItems[ Capacity ];
};
我不理解的幕后发生了什么?什么是关于std :: vector&lt;&gt;这处理得当吗?谢谢!
答案 0 :(得分:2)
您的用例对我来说似乎有点奇怪,因为C ++中的每个构造都没有,因为您已将其写下来了。 C ++ 11中引入了常规for
和基于范围的for
。我只能猜测你的实际用例是什么,但很可能由于const-correctness错误而编译器抱怨。如果没有您尝试运行的真实代码,我无法确切地确定您的错误。无论如何,下面是一个展示这两种用法的工作示例。希望它有所帮助,但如果您有任何问题 - 请随时跟进,我会尝试解释。
#include <cstdlib>
#include <iostream>
template <typename T, std::size_t Capacity>
class List {
public:
List() : mSize(0) {}
const T *begin() const { return mItems; }
const T *end() const { return mItems + mSize; }
T *begin() { return mItems; }
T *end() { return mItems + mSize; }
void add(int v)
{
// TODO: Check for out of range here...
mItems[mSize++] = v;
}
private:
size_t mSize;
T mItems[Capacity];
};
int main()
{
/* const */ List<int, 10> array;
array.add(1);
array.add(11);
array.add(15);
array.add(3);
// C++11 style (range-based for)
for (int p : array) {
std::cout << p << '\n';
}
// Pre C++11 style
for (const int *from = array.begin(), *to = array.end(); from != to; ++from)
{
int p = *from;
std::cout << p << '\n';
}
}