我以前的代码在从g++-5迁移到g++-6时失败了;以前可还原的模板不再是可还原的。一个最小的例子是:
#include <math.h>
template<typename T,typename T1>
T apply(T (*func)(T1), const T1 &val)
{
return func(val);
}
int main(void)
{
double val1 = 0.5, val2 = apply(ceil,val1);
return 0;
}g++-6似乎找不到正确的ceil版本。
foo.cpp: In function ‘int main()’:
foo.cpp:11:44: error: no matching function for call to ‘apply(<unresolved overloaded function type>, double&)’
double val1 = 0.5, val2 = apply(ceil,val1);
^
foo.cpp:4:3: note: candidate: template<class T, class T1> T apply(T (*)(T), const T1&)
T apply(T (*func)(T), const T1 &val)
^~~~~
foo.cpp:4:3: note: template argument deduction/substitution failed:
foo.cpp:11:44: note: couldn't deduce template parameter ‘T’
double val1 = 0.5, val2 = apply(ceil,val1);g++-5没有问题,按预期工作.在使用g++ 8的编译器资源管理器( Compiler )时,我还看到了从clang-3.3 (编译)到clang-3.4 (不编译)的反转。
考虑到代码仍然不能工作,即使在当前的g++中,我也认为错误是我的错。我做错了什么,该如何解决呢?
发布于 2019-01-09 11:28:27
如果您正在使用(或计划使用) C++17,您应该知道有一个更健壮的库函数正在执行您想要做的事情:std::调用
使用它,您的示例可以简化为:
#include <cmath>
#include <functional>
int main(void)
{
double val1 = 0.5, val2 = std::invoke(ceil,val1);
return 0;
}有趣的是,使用手工构建的apply和库std::invoke,如果编写std::invoke(std::ceil, val1),代码将失败。这需要进一步调查..。
https://stackoverflow.com/questions/54108162
复制相似问题