c ++函数名称歧义

时间:2017-08-15 13:50:13

标签: c++ c++11 overloading

我的班级有两个具有相同名称和以下签名的函数:

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并将其调用,则可以。有没有办法让这两个函数变得模糊不清?

2 个答案:

答案 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,则将调用第二个函数,否则将调用第一个版本。

相关问题