【问题标题】:c++ function name ambiguityc++ 函数名歧义
【发布时间】:2017-08-16 20:29:57
【问题描述】:

我的班级有两个同名的函数,签名如下:

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 并调用它,那很好。有没有办法让这两个功能明确?

【问题讨论】:

  • 声明dconst:Mat&lt;int, 3, 4&gt; const d;
  • 当我重新发明轮子来学习 C++ 时(就像你显然正在做的那样),我将其中一个设为静态,另一个设为方法;或者,我打电话给一个getTranspose() 和另一个transpose()
  • @Luca 你做错了什么:你不能用返回值重载。
  • @Luca 没有理由应该首选const 版本。也没有一种方法,不包括实例被const 或强制转换为const,或将成员函数指针强制转换为正确的重载。
  • “此方法执行就地转置” - 所以我称之为inplace_transpose。 :-) 问题是两个函数做不同的事情,但名称相同。

标签: c++ c++11 overloading


【解决方案1】:

overload resolution 不依赖于返回值,它取决于哪个函数的参数与参数最匹配。您必须将被调用的对象设为const,才能调用const 成员函数重载。例如

Mat<int, 4, 3> e = const_cast<const Mat<int, 3, 4>&>(d).transpose();

【讨论】:

  • @LogicStuff 是的。但是const_cast 在这里不应该更合适吗?因为它与const 相关。
  • 已讨论here。但是,这取决于程序员。有些人可能习惯于看到 const_cast 仅用于删除 cv-qualifiers,有些则不会。
  • @LogicStuff 我可以理解。老实说,我自己也不确定。
【解决方案2】:

你不能通过返回类型重载函数。在下面的线程中讨论

Is it possible to have different return types for a overloaded method?

在您的情况下,您已经在“const”的基础上过度使用。因此,如果您将 d 声明为 const,则将调用第二个函数,否则将调用第一个版本。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-10-14
    • 1970-01-01
    • 2017-12-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多