我的班级有两个具有相同名称和以下签名的函数:
Mat<T, rows, cols> & transpose()
{
for (size_t i = 0; i < rows; ++i) {
for (size_t j = i + 1; j < cols; ++j) {
std::swap(at(i, j), at(j, i));
}
}
return *this;
}
此方法执行矩阵的原位转置。现在,我有另一个函数,它保持原始矩阵不变,并在新矩阵中进行转置。签名是:
Mat<T, cols, rows> transpose() const
请注意,交换了列和行。
现在,我将其称为:
Mat<int, 3, 4> d;
// Fill this matrix
Mat<int, 4, 3> e = d.transpose();
这仍然试图调用第一种方法。如果我将第二种方法重命名为transpose2
并将其调用,则可以。有没有办法让这两个函数变得模糊不清?
答案 0 :(得分:7)
overload resolution不依赖于返回值,它取决于哪个函数的参数最接近参数。您必须使被调用的对象为const
,以便调用const
成员函数重载。 e.g。
Mat<int, 4, 3> e = const_cast<const Mat<int, 3, 4>&>(d).transpose();
答案 1 :(得分:4)
你不能通过返回类型重载函数。在下面的线程中讨论
Is it possible to have different return types for a overloaded method?
在你的情况下,你已经在&#34; const&#34;的基础上进行了上传。因此,如果将d声明为const,则将调用第二个函数,否则将调用第一个版本。