C++ 覆盖代理类c+的std::swap+;

C++ 覆盖代理类c+的std::swap+;,c++,c++11,std,C++,C++11,Std,我被指派使用自定义随机访问迭代器实现一个vector类,将每个bool表示为无符号int数组中的一位。我使用的是一个代理类,它有一个指向无符号int的指针和一个索引变量,该变量表示修改的位 因此,我的向量s运算符[]如下所示: BoolVectorProxy operator[](std::size_t index) { validate_bounds(index); return BoolVectorProxy(&array[index / BLOCK_CAPACITY

我被指派使用自定义随机访问迭代器实现一个
vector
类,将每个
bool
表示为
无符号int
数组中的一位。我使用的是一个代理类,它有一个指向
无符号int
的指针和一个
索引
变量,该变量表示修改的位

因此,我的
向量
s
运算符[]
如下所示:

BoolVectorProxy operator[](std::size_t index) {
    validate_bounds(index);
    return BoolVectorProxy(&array[index / BLOCK_CAPACITY], index % BLOCK_CAPACITY);
}
到目前为止还不错-但是,当我们需要在迭代器上(在方括号操作符和解引用操作符上也返回
BoolVectorProxy
)进行一些交换时,会发生什么

此代码不编译:

Vector<bool> a({true, false});
std::swap(a[0], a[1]);
std::cout << a[0] << " " << a[1] << std::endl;
向量a({true,false});
std::swap(a[0],a[1]);
std::cout问题在于声明为:

template< class T >
void swap( T& a, T& b );
并对
交换进行非限定调用

Vector<bool> a({true, false});
using std::swap;
swap(a[0], a[1]);
向量a({true,false});
使用std::swap;
掉期(a[0],a[1]);
这是一个非常普遍的需求,将其概括为:

template <typename T>
void adl_swap(T&& a, T&& b) {
    using std::swap;
    swap(std::forward<T>(a), std::forward<T>(b));
}
模板
无效adl_掉期(T&a、T&b){
使用std::swap;
交换(标准:远期(a),标准:远期(b));
}
你可以用它来写:

Vector<bool> a({true, false});
adl_swap(a[0], a[1]);
向量a({true,false});
adl_掉期(a[0],a[1]);

定义通过ADL找到的命名空间范围交换。正确的泛型代码不会使用
std::swap
,而是使用std::swap;掉期(a、b)你能把你的评论扩展成一个答案吗?如果可以的话,我会接受的!谢谢@哥伦布好的,那很简单-谢谢!
Vector<bool> a({true, false});
adl_swap(a[0], a[1]);