繁体   English   中英

C ++模糊模板实例化

[英]C++ ambiguous template instantiation

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

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

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

我测试过Clang,GCC和Comeau的代码。 当GCC和Clang接受它时,Comeau拒绝它。 我认为,对于这两组编译器,可以提出要点

  • Comeau遵循C ++ 03规则,该规则要求推导出的模板参数“完全匹配(因此推论不依赖于隐式转换)”。 然而,这个规范非常严格 ,并且已经完全重写为C ++ 0x。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM