我设计了一个类,其中包含两个采用不同大小的 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/