C ++模糊模板实例化

时间:2010-05-28 18:16:43

标签: c++ templates

下面给出了使用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());  

2 个答案:

答案 0 :(得分:5)

AFAIK,问题是你的非类型参数输入不一致(即MN在这里int,但size_t在那里。这意味着并非所有模板变量赋值都可以在另一个中使用,这意味着没有部分排序,因此错误信息。

联合模板非类型参数类型,它应该可以工作。

答案 1 :(得分:3)

我在Clang,GCC和Comeau上测试了代码。当GCC和Clang接受它时,Comeau拒绝它。我认为对于两组编译器都可以得到分数

  • Comeau遵循C ++ 03规则,该规则要求对推导出的模板参数进行“完全匹配(因此推论不依赖于隐式转换)”。但是这个规范是horribly underspecified并且已经完全重写了C ++ 0x。

  • Clang和GCC似乎实现了重写规则,这条规则更好地指定了“完全匹配”的含义。该规范适用于不同类型的阵列尺寸。

在任何情况下,如果你想对所有编译器都很好,那么真的按照接受的答案并将非类型参数类型更改为常见类型:)