交换函数的 C++ 重载不起作用

标签 c++ template-specialization specialization

我正在编写一个自定义类,我想为其使用 std::swap 函数。

正如我在这篇文章中读到的 How to overload std::swap() ,我必须在我尝试交换的对象的同一个命名空间中重载它,这里有一个例子。

I (thing) 我正在复制示例,但是在使用 std::swap() 时调用的函数不是我定义的函数。

这是我的代码:

//grid.hpp
namespace myname {
template <typename T>
class Grid
{
    ...
    friend void swap(Grid &a, Grid &b)
    {
        using std::swap;
        std::cout << "Custom Swap Used" << std::endl;
        swap(a.nrwow, b.nrows);
        swap(a.ncols, b.ncols);
        a.grid.swap(b.grid);
    }
}
}

但是当我调用交换函数时没有字符串被打印出来,所以这个函数没有被调用。

//file.cpp
#include"../src/grid.hpp"

int main() {
myname::Grid<int> grid1(10, 10);
myname::Grid<int> grid2(10, 10);
std::swap(grid1, grid2); // this should print a string
}

最佳答案

你必须使用 std::ranges::swap ,或者如果您不使用 C++20,则通过 ADL 找到它:

myname::Grid<int> grid1(10, 10);
myname::Grid<int> grid2(10, 10);

std::ranges::swap(grid1, grid2);

// Or with ADL
using std::swap;
swap(grid1, grid2);

"Swapping"并不完全意味着 std::swap , 但这种形式的“using std::swap; swap(x, y); ”, 被 std::ranges::swap 封装.


写作 std::swap(grid1, grid2)直接调用默认的 template<typename T> void std::move(T&, T&); .这将使用移动构造和移动赋值运算符而不是您的自定义交换函数,这就是您看不到 "Custom Swap Used" 的原因。 .

关于交换函数的 C++ 重载不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70645649/

相关文章:

c++ - bool 表达式作为模板参数

c++ - 在 C++ 中顺序插入/读取/删除最快的数据结构是什么?

c++ - __declspec() 中的 "storage-class information"是什么意思?

c++ - Qt 对象的生命周期

C++ 模板特化/重载

c++ - 仅专门化模板类的一个方法(的一部分)

swift - Swift 3 中通过间接调用调用了错误的专用泛型函数

c++ - 实现提供的复制构造函数和赋值运算符

C++ 模板特化,但未找到匹配项

C++模板解释