c++ - 专门用于自定义容器的 std::swap 算法

标签 c++ templates

我写了自己的 vector 和堆栈,它们是类模板,都工作正常,现在我想为我的堆栈专门化 std::swap 算法,所以我定义了一个函数模板交换作为 vector 的 friend ,它使用在 vector 内部交换。然后我在堆栈中定义了一个交换成员函数。但是如果我尝试调用该交换函数,它无法编译。 vs2019 说“交换函数不接受两个参数”。我认为堆栈类中的交换将使用参数依赖查找,但它没有那样做。请帮助我,正确的方法是什么?多谢。 vector和stack的部分代码如下

vector .h

  template<class Object>
    void swap(Vector<Object>& lhs, Vector<Object>& rhs) {
        lhs.swap(rhs);
    }
    template<class Object>
    class Vector {
        //.....
        friend void swap<>(Vector<Object>& lhs, Vector<Object>& rhs);
    public:
        //...
        void swap(Vector &rhs){
        //....
        }
    }

堆栈.h

 #include"Vector.h"
    template<class Object,class Container>
    class Stack {
    //......
    void swap(Stack &other) {
        swap(container, other.container);
    }

主要.cpp

//....
int main() {
//....
    Stack<int,Vector<int>>s1,s2;
    s1.swap(s2);
}
//....

最佳答案

这是一个简单的名称隐藏案例:在 Stack 类中,名称 swapStack::swap

如果你想使用一些其他的功能,你需要提供一个明确的范围,如

::swap(container, other.container);

请注意使用 :: 范围运算符来使用全局范围内的 swap 函数。

关于c++ - 专门用于自定义容器的 std::swap 算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59176588/

相关文章:

c++ - Windows (.lnk) 快捷方式 API?

c++ - QStandardItem 全局位置

c++ - C++ 包装 C 代码的重复 const 错误

templates - 无法在cloudstack上注册ISO或模板

c++ - 为什么在全局命名空间中使用 << 运算符是一个坏主意?

c++ - 我需要清理非指针数据成员吗?

c++ - 无法推断 'TYPE' 的模板参数

c++ - 如何导出模板函数的输出类型?

c++ - priority_queue 的仿函数和函数以及某种 C++

c++ - lambdas 中的模板参数列表中的 auto 是标准的一部分吗?