小编DS_*_*don的帖子

使用“|” 带 std::views 的(管道)运算符无法编译

在职业转移之后,我试图跟上 std::views (以及一般的函数式编程)的步伐。我正在使用“|” (管道)运算符与向量上的 std::views::filter ,我很困惑为什么有些代码结构可以编译,而另一些则不能。

此代码创建 的向量的向量int,然后按总和对其进行过滤。我已经评论了令我困惑的三个语句,其中前两个可以编译,第三个则不能。

编译错误是:

'|': no operator found which takes a left-hand operand of type 'std::vector<std::vector<int,std::allocator<int>>,std::allocator<std::vector<int,std::allocator<int>>>>' (or there is no acceptable conversion)  
Run Code Online (Sandbox Code Playgroud)

(使用MSVC19,用 编译/std:c++latest

我很困惑为什么这不能编译,而 (2) 尤其可以编译?

#include <vector>
#include <numeric>
#include <ranges>

template<typename T>
auto buildMultiples(const std::vector<T>& base)
{
    std::vector<std::vector<T>> vRet;
    for(T n= 1; n <= 5; n++)
    {
        auto v = base;
        for (auto& m : v) m *= n;
        vRet.push_back(v);
    }
    return vRet;
}

template<typename T>
struct sumGreaterThan …
Run Code Online (Sandbox Code Playgroud)

c++ std c++20

7
推荐指数
1
解决办法
1546
查看次数

在 LET 语句中使用 RANDARRAY 和 RANK.EQ 会产生错误

我正在尝试使用 RANDARRAY 和 RANK.EQ 生成一个洗牌集。

将公式分解为两个单独的调用并将中间数字放入辅助列中是可行的。

B2==RANDARRAY(2)

C2==RANK.EQ(B2#,B2#)

但是当我尝试使用 LET 将两者结合起来时,我收到错误(如屏幕截图所示)。

B6==LET(arr,RANDARRAY(2),RANK.EQ(arr,arr))

在单元格上,会出现一个小警告三角形,并带有文本:“公式中使用的值的数据类型错误”

在此输入图像描述

RANDARRAY 是易失性的,因此每次调用时都会给出一个新数组,但我天真地希望该函数仅被调用一次,然后将 RANK.EQ 应用于随机数的静态向量。

excel excel-formula

5
推荐指数
0
解决办法
100
查看次数

为 Visual Studio 安装 Python 调试符号

我的最终目标是调试一个 Python 脚本,该脚本调用我自己用 C++ 编写的 COM dll。在 MS Visual Studio Community 2019 中使用 Python 3.8。

我的主要问题是调试。MSVC 不断要求 Python38.dll 的调试符号,并且无法命中断点。

在我的 Python 项目的“调试属性”中,如果不选中“启用本机代码调试”,那么我的 Python 将在我设置的断点处正确运行和停止。COM dll 在断言上失败(这就是我正在尝试调试的),并且我获得了“重试调试”选项...但没有任何反应,并且我的 python 代码结束了 ( The program 'python3.8.exe' has exited with code -1 (0xffffffff).)

在此输入图像描述

如果我选中“启用本机代码调试”,程序会忽略我的 Python 断点,并弹出此窗口: 在此输入图像描述

如果我选择“关闭”,则 Visual Studio 开始运行 Python 脚本(不会命中任何 Python 脚本断点),会命中断言,然后选择“重试”会在有问题的行处打开我的 C++ 代码(这至少有帮助)一个点)。如果从 Excel 中的 VBA 驱动,同一个 COM dll 工作正常,所以我怀疑通过 win32com.client 传递参数有问题,所以我想检查 dll 是否正在接收我认为我正在发送的内容:因此需要调试。

如果我“打开符号设置对话框”,我会得到以下信息: 在此输入图像描述

您可以在其中看到我按照 MS 网站上的说明进行操作,并使用 Python 3.8 安装程序来安装符号。目录 C:\Program Files\Python38 确实包含 python38.pdb。我怀疑 Visual Studio 正在从其他地方加载 python?我是否将符号安装在错误的位置?

我希望能够单步执行我的 Python …

c++ python debugging visual-studio

3
推荐指数
1
解决办法
6065
查看次数

使用 std::views 进行模板类型推断

我有点晚了才接触函数式编程,并开始了解范围/视图。我正在使用 MSVC19 并针对 C++ 20 进行编译。

我正在使用std::views::transform,编译器似乎并没有像我天真地希望的那样推断类型。

这是一个小例子,它只需要一个字符串向量并计算它们的长度:

#include <vector>
#include <iostream>
#include <ranges>

template<typename E>
auto length(const E& s)
{
    std::cout << "Templated length()\n";
    return static_cast<int>(s.length());
}

template<typename E>
auto getLengths(const std::vector<E>& v)
{
    return  v | std::views::transform(length<E>);
}

int main()
{
    std::vector<std::string> vec = { "Larry","Curly","Moe" };
    for (int i : getLengths(vec))
    {
        std::cout << i << "\n";
    }
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

输出:

Templated length()
5
Templated length()
5
Templated length()
3
Run Code Online (Sandbox Code Playgroud)

我的问题是为什么要更改此行中的代码(删除<E>): …

c++ templates c++20

2
推荐指数
1
解决办法
138
查看次数

标签 统计

c++ ×3

c++20 ×2

debugging ×1

excel ×1

excel-formula ×1

python ×1

std ×1

templates ×1

visual-studio ×1