gpt4 book ai didi

c++ - 表达式模板玩具示例 : user-defined cast not applied for complex types

转载 作者:行者123 更新时间:2023-12-02 02:52:32 26 4
gpt4 key购买 nike

我正在尝试使用基于 this blogpost 的现代 C++17 构建表达式树的玩具示例。 。该代码适用于 intdouble 等基本类型。但是,当我尝试使用诸如 Eigen::Vector3d 之类的东西时,构建会失败,因为用户定义的强制转换运算符 result_t() const 未正确应用(我假设) .

有人可以告诉我失败的具体原因是什么吗?

#include <Eigen/Dense>

template <class T, class U, class Callable>
struct BinaryExpression {

const T* left {nullptr};
const U* right {nullptr};
Callable callable;

BinaryExpression(const T& t, const U& u, const Callable c)
: left(&t), right(&u), callable(c) {}

auto operator()() const
{
return callable(*left, *right);
}

using result_t = decltype(std::declval<Callable>()(std::declval<const T&>(), std::declval<const U&>()));
operator result_t() const
{
return this->operator()();
}
};

struct Plus {
template <class T, class U>
auto operator()(const T& left, const U& right) const
{
return left + right;
}
};

int main()
{
Eigen::Vector3d v1 (1, 2, 3);
Eigen::Vector3d v2 (1, 2, 3);

int num1 = 1;
double num2 = 2.4;

BinaryExpression expr(num1, num2, Plus{});
BinaryExpression expr2(num2, expr, Plus{}); // this works fine

BinaryExpression expr3(v1, v2, Plus{});
BinaryExpression expr4(expr3, v1, Plus{}); // why does this give an error?
}

编译器错误消息

../main.cpp: In instantiation of ‘auto Plus::operator()(const T&, const U&) const [with T = BinaryExpression<Eigen::Matrix<double, 3, 1>, Eigen::Matrix<double, 3, 1>, Plus>; U = Eigen::Matrix<double, 3, 1>]’:
.../main.cpp:36:55: required from ‘struct BinaryExpression<BinaryExpression<Eigen::Matrix<double, 3, 1>, Eigen::Matrix<double, 3, 1>, Plus>, Eigen::Matrix<double, 3, 1>, Plus>’
.../main.cpp:63:45: required from here
.../main.cpp:47:21: error: no match for ‘operator+’ (operand types are ‘const BinaryExpression<Eigen::Matrix<double, 3, 1>, Eigen::Matrix<double, 3, 1>, Plus>’ and ‘const Eigen::Matrix<double, 3, 1>’)
return left + right;
~~~~~^~~~~~~

据我了解,operator+ 未定义用于添加具有 Matrix 类型的 BinaryExpression。但是,我希望代码应用用户定义的 BinaryExpression 转换,将其计算为 Matrix ,因此调用 operator+ 来添加两个矩阵类型。

最佳答案

第47行是他们不知道变量“left”和“right”的类型。如果将 int 与字符串相加,则会产生错误。

关于c++ - 表达式模板玩具示例 : user-defined cast not applied for complex types,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58709891/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com