可变模板:表达式列表在函数转换错误中被视为复合表达式
variadic templates: expression list treated as compound expression in functional cast error
我试图将一个函数作为参数,并将一个参数包作为第二个参数传递给包装函数。
在这种简单的情况下,包装函数应该使用包中的参数执行传递的函数,测量执行时间并退出。
但我在Ubuntu 18.04:上得到了g++7.3.0(c++14)的编译错误
error: expression list treated as compound expression in functional cast [-fpermissive]
对于线路:
func(&args...);
包装看起来如下:
template<typename func, typename ...Types>
void measure_time(func, Types... args)
{
auto start = std::chrono::system_clock::now();
// execute function here
func(&args...);
auto end = std::chrono::system_clock::now();
std::cout << "Time for execution "
<< std::chrono::duration_cast<std::chrono::microseconds>(end-start).count()
<< " microsecondsn";
}
我是泛型编程和参数包的新手,但根据参数包的cpp引用,这应该能工作吗?
调用measure_time函数,例如使用简单的binary_search:
int binary_search(int *a, int v, int l, int r)
{
while(r >= 1)
{
int m = (l+r)/2;
if(v == a[m]) return m;
if(v < a[m]) r = m-1; else l = m+1;
if(l==m || r==m) break;
}
return -1;
}
生成以下实例化(对我来说似乎是正确的)作为错误源:
In instantiation of ‘void measure_time(func, Types ...) [with func = int (*)(int*, int, int, int); Types = {int*, int, int, int}]’:
我发现这篇文章描述了一个编译器错误,但我缺乏了解情况的知识,如果是这种情况,似乎无法推断出可行的解决方案:具有可变模板参数的临时对象;另一个g++/crang++差异
编辑:使用-fpermission标志运行程序,然后执行程序,可以完美运行。
应该是:
template<typename Func, typename ...Types>
void measure_time(Func func, Types&&... args)
{
auto start = std::chrono::system_clock::now();
// execute function here
func(std::forward<Types>(args)...);
auto end = std::chrono::system_clock::now();
std::cout << "Time for execution "
<< std::chrono::duration_cast<std::chrono::microseconds>(end-start).count()
<< " microsecondsn";
}
但更好的方法是在RAII类中设置时间,以便轻松返回函数的值。
相关文章:
- 在 C++ 中使用正则表达式错误时出现问题 括号表达式中的范围无效
- C++ 标记之前预期主表达式'('错误
- 正则表达式中带有卷轴大括号的正则表达式错误
- C++初学者错误:主要表达式错误
- 代数树表达式C++错误:未解析的外部符号"Public:_thiscall AlgebraicTreeExpression::~AlgebraicTreeExpression(void) ..."
- 使用多线程处理对象数组 - 无效使用 void 表达式错误
- 为什么 if constexpr 不会使这个核心常量表达式错误消失?
- 提升正则表达式错误:未初始化的提升::match_results
- C++比较表达式错误
- C++ "主表达式"错误
- C++ 正则表达式错误(未处理的异常)
- 'this'不能用于常量表达式错误 (C++)
- 代码块引发有关for_each的预期主表达式错误
- Boost Regex中的命名子表达式错误
- C++之前的主要表达式错误
- Ubuntu 上的正则表达式错误
- C++正则表达式错误
- 理解常量表达式错误
- 成员函数和预期的主表达式错误
- Xcode中应有表达式错误