有下一个代码问题不同的优先级:C++可变参数模板:在GCC和NVCC /英特尔
#include <iostream>
#include <functional>
using namespace std;
template<typename... Args>
inline double foo(function<double (Args...)> fun, Args... args) {
return fun(args...);
}
template<typename... Args, typename... ArgsTmp>
double foo(function<double (Args...)> fun, ArgsTmp... args) {
return foo(fun, 1., args...);
}
int main() {
function<double (double, double, double)> fun = [&](double x, double y, double z) -> double {
return x+y+z;
};
cout << foo(fun) << endl;
}
当我用gcc编译的一切它去罚款。但是,如果我试图编译它,例如,与英特尔或NVCC-7.5(这实际上是我的目标),我发现了以下错误:
more than one instance of overloaded function "foo" matches the argument list:
function template "double foo(std::vector<limits, std::allocator<limits>>, std::function<double (Args...)>, Args...)"
function template "double foo(std::vector<limits, std::allocator<limits>>, std::function<double (Args...)>, ArgsTmp...)"
argument types are: (std::vector<limits, std::allocator<limits>>, std::function<double (double, double, double)>, double, double, double)
...
1 error
有没有什么办法让编译器知道明确指出当Args==ArgsTmp
(在第二个模板中)foo()
的下列实现应该被拒绝?
我不知道这是怎么多的事情来帮助你,但代码是罚款 - 当Args和ArgsTmp完全相同时,第一个模板的专门化应该是首选的,因为根据功能模板的部分排序规则,第一个模板比第二个模板更专用。该代码在GCC 5.2.0,Clang 3.7.0和VC++ 2013和2015上运行良好。如果错误来自nvcc转发编译的主机编译器,则可能需要了解哪些版本可能会升级。 – bogdan