下面给出了使用nvcc(EDG前端和g ++的组合)的模糊模板实例化。 它真的很模糊,还是编译器错了?我还发布了解决方案àlaboost :: enable_if
template<typename T> struct disable_if_serial { typedef void type; };
template<> struct disable_if_serial<serial_tag> { };
template<int M, int N, typename T>
__device__
//static typename disable_if_serial<T>::type
void add_evaluate_polynomial1(double *R,
const double (&C)[M][N], double x,
const T &thread) {
// ...
}
template<size_t M, size_t N>
__device__
static void add_evaluate_polynomial1(double *R,
const double (&C)[M][N], double x,
const serial_tag&) {
for (size_t i = 0; i < M; ++i)
add_evaluate_polynomial1(R, C, x, i);
}
// ambiguous template instantiation here.
add_evaluate_polynomial1(R, C, x, serial_tag());
答案 0 :(得分:5)
AFAIK,问题是你的非类型参数输入不一致(即M
和N
在这里int
,但size_t
在那里。这意味着并非所有模板变量赋值都可以在另一个中使用,这意味着没有部分排序,因此错误信息。
联合模板非类型参数类型,它应该可以工作。
答案 1 :(得分:3)
我在Clang,GCC和Comeau上测试了代码。当GCC和Clang接受它时,Comeau拒绝它。我认为对于两组编译器都可以得到分数
Comeau遵循C ++ 03规则,该规则要求对推导出的模板参数进行“完全匹配(因此推论不依赖于隐式转换)”。但是这个规范是horribly underspecified并且已经完全重写了C ++ 0x。
Clang和GCC似乎实现了重写规则,这条规则更好地指定了“完全匹配”的含义。该规范适用于不同类型的阵列尺寸。
在任何情况下,如果你想对所有编译器都很好,那么真的按照接受的答案并将非类型参数类型更改为常见类型:)