lambda/function 指针与 std::function 导致错误
lambda/function pointer with std::function causes error
更新:
这些错误似乎来自 Eclipse 的代码分析器 CODAN,它们出现在“问题”视图中,并且还在错误所指的行上用红色下划线标出。奇怪的是,构建项目成功创建了可执行文件,并且构建不会在控制台中报告这些错误。我可以 运行 该可执行文件并获得预期的输出。
所以现在问题变成了:如何让 Eclipse 的 CODAN 识别这些使用 std::function
的 lambda 和函数指针不是错误?
原问题:
在下面的 C++ 代码中,它直接用 g++
编译很好,但在 Eclipse 中会导致错误 CDT。我怎样才能让我的 Eclipse 项目识别并允许将 lambdas(或函数指针)与 std::function
一起使用?
注意:请参阅问题底部的编辑以获取更新
#include <functional>
#include <iostream>
void foo(int i) {
std::cout << i << std::endl;
}
void function_ptr(void (*bar)(int)) {
bar(1);
}
void function_std(std::function<void(int)> baz) {
baz(2);
}
int main() {
// these function calls are ok
function_ptr(&foo);
function_ptr([](int i) -> void {
foo(i);
});
// these function calls cause errors
function_std(&foo);
function_std([](int i) -> void {
foo(i);
});
// these assignments cause errors
std::function<void(int)> f1 = foo;
std::function<void(int)> f2 = [](int i) -> void {
foo(i);
};
f1(3);
f2(3);
return 0;
}
在命令行上编译此代码按预期工作并产生以下输出:
$ g++ src/LambdaFunctionParameterExample.cpp -o example
$ ./example
1
1
2
2
3
3
但是在 Eclipse 中,接受 std::function
作为参数的函数调用会产生此错误:
Invalid arguments '
Candidates are:
void function_std(std::function<void (int)>)
'
并且 std::function
变量赋值产生了这个错误:
Invalid arguments '
Candidates are:
function()
function(std::nullptr_t)
function(const std::function<void (int)> &)
function(std::function<void (int)> &&)
function(#10000)
'
我在项目 -> 属性 -> C/C++ 构建 -> GCC C++ 编译器 -> 方言中将语言标准设置为 ISO C++17 (-std=c++17)
。 (我假设设置此 属性 是根据此 documentation 访问 <functional>
header 所必需的。奇怪的是,指定(或不指定)语言级别不会影响以上错误。并且,直接使用 g++
构建时不需要指定语言级别。)
我正在使用 macOS Catalina 10.15.5、来自自制软件的 gcc 10.2.0 和 Eclipse CDT 版本 2020-09 (4.17.0)。
此行为是 known bug 与 Eclipse CDT 版本 10.0 的行为。
更新:
此问题已通过升级到 Eclipse CDT 版本 10.1 得到解决:
https://download.eclipse.org/tools/cdt/builds/10.1/cdt-10.1.0-rc2/
修复步骤:
- 在
Help
中输入上面的URL-->Install New Software...
-->Work with:
并安装所有选项
- 重新启动 Eclipse。
- Select
Project
--> C/C++ Index
--> Rebuild
.
更新:
这些错误似乎来自 Eclipse 的代码分析器 CODAN,它们出现在“问题”视图中,并且还在错误所指的行上用红色下划线标出。奇怪的是,构建项目成功创建了可执行文件,并且构建不会在控制台中报告这些错误。我可以 运行 该可执行文件并获得预期的输出。
所以现在问题变成了:如何让 Eclipse 的 CODAN 识别这些使用 std::function
的 lambda 和函数指针不是错误?
原问题:
在下面的 C++ 代码中,它直接用 g++
编译很好,但在 Eclipse 中会导致错误 CDT。我怎样才能让我的 Eclipse 项目识别并允许将 lambdas(或函数指针)与 std::function
一起使用?
注意:请参阅问题底部的编辑以获取更新
#include <functional>
#include <iostream>
void foo(int i) {
std::cout << i << std::endl;
}
void function_ptr(void (*bar)(int)) {
bar(1);
}
void function_std(std::function<void(int)> baz) {
baz(2);
}
int main() {
// these function calls are ok
function_ptr(&foo);
function_ptr([](int i) -> void {
foo(i);
});
// these function calls cause errors
function_std(&foo);
function_std([](int i) -> void {
foo(i);
});
// these assignments cause errors
std::function<void(int)> f1 = foo;
std::function<void(int)> f2 = [](int i) -> void {
foo(i);
};
f1(3);
f2(3);
return 0;
}
在命令行上编译此代码按预期工作并产生以下输出:
$ g++ src/LambdaFunctionParameterExample.cpp -o example
$ ./example
1
1
2
2
3
3
但是在 Eclipse 中,接受 std::function
作为参数的函数调用会产生此错误:
Invalid arguments '
Candidates are:
void function_std(std::function<void (int)>)
'
并且 std::function
变量赋值产生了这个错误:
Invalid arguments '
Candidates are:
function()
function(std::nullptr_t)
function(const std::function<void (int)> &)
function(std::function<void (int)> &&)
function(#10000)
'
我在项目 -> 属性 -> C/C++ 构建 -> GCC C++ 编译器 -> 方言中将语言标准设置为 ISO C++17 (-std=c++17)
。 (我假设设置此 属性 是根据此 documentation 访问 <functional>
header 所必需的。奇怪的是,指定(或不指定)语言级别不会影响以上错误。并且,直接使用 g++
构建时不需要指定语言级别。)
我正在使用 macOS Catalina 10.15.5、来自自制软件的 gcc 10.2.0 和 Eclipse CDT 版本 2020-09 (4.17.0)。
此行为是 known bug 与 Eclipse CDT 版本 10.0 的行为。
更新:
此问题已通过升级到 Eclipse CDT 版本 10.1 得到解决:
https://download.eclipse.org/tools/cdt/builds/10.1/cdt-10.1.0-rc2/
修复步骤:
- 在
Help
中输入上面的URL-->Install New Software...
-->Work with:
并安装所有选项 - 重新启动 Eclipse。
- Select
Project
-->C/C++ Index
-->Rebuild
.