交换函数的 C++ 重载不起作用
C++ overload of swap function not working
我正在编写自定义 class,我想为其使用 std::swap 函数。
正如我在这篇 post 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"
.
的原因
我正在编写自定义 class,我想为其使用 std::swap 函数。
正如我在这篇 post 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"
.