采用常量 Eigen 参数的重载函数的歧义
ambiguity of overloaded function taking constant Eigen argument
我设计了一个 class,其中有两个重载函数采用不同大小的 Eigen 数据结构。
只要传递左值,代码就会编译,但如果传递右值,则会出现编译器错误歧义,因为 return 相同 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()
的 return 类型不是矩阵,而是特征表达式。
因此,以最少的更改实现您想要的效果的一种方法是使用显式矩阵求值:
moa.ambiguousOverload(Eigen::Vector4d::Zero().eval());
您可能还想考虑编写以 Eigen 表达式为参数(而不是显式矩阵)的函数,作为替代解决方案。
我设计了一个 class,其中有两个重载函数采用不同大小的 Eigen 数据结构。
只要传递左值,代码就会编译,但如果传递右值,则会出现编译器错误歧义,因为 return 相同 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()
的 return 类型不是矩阵,而是特征表达式。
因此,以最少的更改实现您想要的效果的一种方法是使用显式矩阵求值:
moa.ambiguousOverload(Eigen::Vector4d::Zero().eval());
您可能还想考虑编写以 Eigen 表达式为参数(而不是显式矩阵)的函数,作为替代解决方案。