朋友功能默认模板:英特尔ICPC警告

时间:2012-08-11 20:20:56

标签: c++ templates c++11 friend icc

我有以下测试代码:

// friendfunction.h                                                                                   
#include <iostream>

template<typename T, unsigned int... TDIM> class MyClass
{
  template<typename T1, typename T0, unsigned int... TDIM0, class> friend inline const MyClass<T0, TDIM0...> myFunction(const T1& x, const MyClass<T0, TDIM0...>& y);
};

template<typename T0, typename T, unsigned int... TDIM, class = typename std::enable_if<std::is_fundamental<T0>::value>::type> inline const MyClass<T, TDIM...> myFunction(const T0& x, const MyClass<T, TDIM...>& y)
{
  std::cout<<"It works !"<<std::endl;
  return MyClass<T, TDIM...>(y);
}

// friendfunction.cpp
#include "friendfunction.h"
int main(int argc, char *argv[])
{
  MyClass<double, 3, 3> myClass;
  myFunction(10, myClass);
  return 0;
}

使用g ++(4.6.1)编译:

g++ -Wall -Wextra -Winline -Wno-unused -O3 -std=c++0x friendfunction.cpp -o friendfunction

使用intel ICPC(12.1.0 20111011):

icpc -Wall -Wno-unused -O3 -std=c++0x friendfunction.cpp -o friendfunction

使用g ++我没有错误也没有警告,但是使用英特尔C ++我有以下警告:

friendfunction.h(5): warning #2922: template parameter "<unnamed>" cannot be used because it follows a parameter pack and cannot be deduced from the parameters of function template "myFunction"
template<typename T1, typename T0, unsigned int... TDIM0, class> friend inline const MyClass<T0, TDIM0...> myFunction(const T1& x, const MyClass<T0, TDIM0...>& y);

有人有解决办法避免这种情况吗?

此外,您是否发现友元函数的语法完全正确/安全,或者您是否认为它会因某些奇怪的情况而产生错误?

1 个答案:

答案 0 :(得分:1)

只是猜测,但似乎icpc希望参数包是最后一个模板参数。如果包中的variadic参数无法与包后面的另一个参数区分开来,那么这是合理的,恕我直言。但在你的情况下,可变参数是整数,下一个是类类型,所以看起来icpc出错了......