无法在部分专业化中推导的模板参数

特马里奇

我有一个类似的问题,就像在这里发现的那样但是可能我仍然在做一些不同的事情,因此我将一无所获。

有些类型将使用标记结构进行标记:

template<typename Geometry=void, typename Enable = void>
struct tag 
{
    typedef void type;
};

并介绍了点和三角形标记:

struct point_tag {}; 
struct triangle_tag {}; 

使用构造点类型std::vector

template<>
struct tag<std::vector<double>>
{
    typedef point_tag type; 
};

和三角形类型作为的别名模板std::array

template<typename Point>
using triangle = 
typename std::enable_if
<
    std::is_base_of<typename tag<Point>::type, point_tag>::value,
    std::array<Point,3>
>::type;

如果作为传递的论点,即启用Point参数真标记point_tag

事后,我想标记所有的三角形triangle_tag这样的:

template <typename Point>
struct tag<triangle<Point>>  
{
    typedef triangle_tag type;
};

由于std::array别名和继承会导致初始化程序列表构造出现问题,因此别名是别名,而不是合成/继承但是,编译失败并显示错误

g++ -std=c++1y main.cpp -o main 
main.cpp:31:8: error: template parameters not deducible in partial specialization:
 struct tag<triangle<Point>>  
        ^
main.cpp:31:8: note:         ‘Point’

如果我不依赖于triangle基于Point被标记参数来启用,而是对所有这样的类型都这样做:

template<typename Point>
using triangle = 
// This works, but there is no restriction on Point to be tagged with point_tag.
std::array<Point, 3>;

然后编译正常。但是,三角形也是一个三角形,我正在基于类型的任意属性使用函数重载,以enable_if失败的那些函数中减少函数模板集我不依赖于容器接口来确定函数模板,因为有时隐式接口是完全相同的,但操作语义不同。例如,三角形是闭合的圆形线段(涉及3个边的操作),而点链是开放式线段(涉及2个边的操作)。所有操作都需要直接访问运算符,这是对模板参数的唯一要求,当enable_if无限制地实现它们时,会导致函数模板实例化的模棱两可-所有这些都在链接的文章中进行了介绍。

这是完整的示例

有什么我想念的吗?如何解决这个问题?

贾罗德42

什么不使用您的Enabletemplate参数?
就像是:

template <typename Point>
struct tag<
    std::array<Point, 3>,
    typename std::enable_if<
        std::is_base_of<
            typename tag<Point>::type,
            point_tag
        >::value
    >::type
>
{
    typedef triangle_tag type;
};

(好吧,您重复enable_if...)

现场例子

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章