c++ - 采用恒定特征参数的重载函数的歧义

标签 c++ overloading eigen ambiguous

我设计了一个类,其中包含两个采用不同大小的 Eigen 数据结构的重载函数。

只要传递左值,代码就会编译,但如果传递右值,则会出现编译器错误歧义,因为两者都返回相同的 ConstantReturnType

这是一个 MWE:

#include <iostream>
#include <Eigen/Geometry>

using namespace std;
using namespace Eigen;


class MyOverloadAmbiguity {
public:
  void ambiguousOverload(const Eigen::Vector3d& v) {
    std::cout << "I'm taking a Vector3d\n";
  }
  void ambiguousOverload(const Eigen::Vector4d& v){
    std::cout << "I'm taking a Vector4d\n";
  }
};


int main()
{
  MyOverloadAmbiguity moa;
  Eigen::Vector3d v3;

  moa.ambiguousOverload(v3); // <--- this works
  moa.ambiguousOverload(Eigen::Vector4d::Zero()); // <--- this doesn't

  return 0;
}
main.cpp:26: error: call of overloaded ‘ambiguousOverload(const ConstantReturnType)’ is ambiguous
   26 |   moa.ambiguousOverload(Eigen::Vector4d::Zero());
      |                                                ^
    main.cpp:10:8: note: candidate: ‘void MyOverloadAmbiguity::ambiguousOverload(const Vector3d&)’
   10 |   void ambiguousOverload(const Eigen::Vector3d& v) {
      |        ^~~~~~~~~~~~~~~~~
main.cpp:13:8: note: candidate: ‘void MyOverloadAmbiguity::ambiguousOverload(const Vector4d&)’
   13 |   void ambiguousOverload(const Eigen::Vector4d& v){
      |        ^~~~~~~~~~~~~~~~~

有没有一种方法可以避免这种情况,而无需显式更改函数名称或添加额外的参数以避免歧义?

最佳答案

您的示例不起作用,因为 Zero() 的返回类型不是矩阵,而是特征表达式。

因此,以最小的改变实现您想要的效果的一种方法是使用显式矩阵评估:

moa.ambiguousOverload(Eigen::Vector4d::Zero().eval());

您可能还需要考虑编写将特征表达式作为参数(而不是显式矩阵)的函数,作为替代解决方案。

关于c++ - 采用恒定特征参数的重载函数的歧义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71437422/

相关文章:

java : "Class Overloading"

c++ - 名称查找和运算符重载如何工作?

c++ - 用特征值初始化 vector C++ 矩阵

c++ - 初始化 Eigen::Map 的 std::array

c++ - Eigen::Tensor 双收缩到标量值

c++ - 我需要做什么才能通过仅在我的 unix 系统上输入名称来运行我的 C++ 程序

c++ - 如何使用数组表设置配置参数?

c# - 一起调试托管和非托管代码

java - Java 中使用 varargs 参数重载方法时的编译器错误

c++ - 什么是更好/内存效率更高的实现方式