Intel C ++编译器无法选择模板函数重载

时间:2018-09-26 16:04:07

标签: c++11 templates g++ overloading icc

C ++ 11中的以下代码可以使用g ++ 6.3.0正确编译,并导致我认为正确的行为(即,选择了第一个函数)。但是,使用Intel的C ++编译器(icc 17.0.4)时,它无法编译。编译器指示存在多个可能的函数重载。

#include <iostream>

template<typename R, typename ... Args>
static void f(R(func)(const int&, Args...)) {
        std::cout << "In first version of f" << std::endl;
}

template<typename R, typename ... Args, typename X = typename std::is_void<R>::type>
static void f(R(func)(Args...), X x = X()) {
        std::cout << "In second version of f" << std::endl;
}

double h(const int& x, double y) {
        return 0;
}

int main(int argc, char** argv) {
  f(h);
  return 0;
}

这是icc报告的错误:

test.cpp(18): error: more than one instance of overloaded function "f" matches the argument list:
            function template "void f(R (*)(const int &, Args...))"
            function template "void f(R (*)(Args...), X)"
            argument types are: (double (const int &, double))
    f(h);
    ^

所以我有两个问题:哪个编译器相对于标准是正确的?以及如何修改此代码以使其编译? (请注意,f是一个面向用户的API,我希望避免修改其原型)。

请注意,如果我在第二版typename X = typename std::is_void<R>::type中删除了X x = X()f参数,则icc可以对其进行编译。

1 个答案:

答案 0 :(得分:1)

这是Intel Compiler 17.0 Update 4中的一个错误。在这种情况下,GCC的行为是正确的。此问题已在Intel Compiler 18.0 Update 4及更高版本中得到解决。