gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-05 02:34:59 24 4
gpt4 key购买 nike

我正在编写一个自定义类,我想为其使用 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com