C ++模板参数推导/替换失败

时间:2017-02-10 17:07:24

标签: c++ templates

我使用的是模板库,其中B类是由A类参数化的模板化类。我有一个声明

template <class A, template <class A> class B>
void foo(){
   B<A> x;
}

稍后我想将其作为

调用
foo<A, B>();

其中X是库中的具体类,Y是库中特定的模板化具体类。但是,我得到标题错误abour模板参数扣除/替换失败。如果我更改foo的声明以删除模板并替换为X和Y,那么一切正常。我也试过

foo<X, Y<X> >();

失败了相同的消息。有人可以解释为什么会这样吗?

我正在使用gcc 5.3.0

这是一个完整的例子,它给出了指示的行为

#include <vector>
template <class A, template <class A> class B>
void foo() {
   B<A> x;
}
void bar() {
   foo<int, std::vector>();
}

2 个答案:

答案 0 :(得分:2)

我可以看到两个问题。

首先,import matplotlib.pyplot as plt import numpy as np from scipy.spatial import ConvexHull points = np.array([(1, 2), (3, 4), (3, 6), (2, 4.5), (2.5, 5)]) hull = ConvexHull(points) np.random.seed(1) random_points = np.random.uniform(0, 6, (100, 2)) for simplex in hull.simplices: plt.plot(points[simplex, 0], points[simplex, 1]) plt.scatter(*points.T, alpha=.5, color='k', s=200, marker='v') for p in random_points: point_is_in_hull = point_in_hull(p, hull) marker = 'x' if point_is_in_hull else 'd' color = 'g' if point_is_in_hull else 'm' plt.scatter(p[0], p[1], marker=marker, color=color) 需要多个模板参数,因此模板模板参数std::vector永远不会匹配template<class A> class B

第二个问题稍微少一点就是std::vector此处class A会影响之前的template<class A> class B class A

要解决这两个问题,您可以将第二个模板参数声明为无名的可变参数模板,如下所示:template <class A/*here*/, template <class A> class B>

结合你得到的一切:

template <class...> class B

编辑:

如果您只想以#include <vector> template <class A, template <class...> class B> void foo() { B<A> x; } void bar() { foo<int, std::vector>(); } 的形式使用B,您可以执行以下操作之一:

B<A>

OR:

template <class A, template <class...> class B>
void foo() {
    using C = B<A>;
    C x;
}

OR(取决于代码的较大点)您可以将整个事件作为一个模板参数接受:

template <class A, template <class...> class B, class C = B<A>>
void foo() {
    C x;
}

答案 1 :(得分:1)

std::vector在一个类上没有模板化,因此它与您的类型不匹配。您可以通过

来强制匹配
template <class X> using MyVector = std::vector<X>;

这将有效。 C ++ 17只是简单地修复它,就像你期望的那样工作。