我使用以下代码遇到编译时间问题:
template <typename T,
template <class T, class Allocator = std::allocator<T> > class C>
bool is_in(const C<T>& a, const C<T>& b);
template <typename T, std::vector> // HERE
bool is_in(const std::vector<T>& a, const std::vector<T>& b)
{
return false; // implementation tbd
}
...
vector<int> a, b;
cout << is_in(a,b) << endl;
错误消息是(在标有“HERE”的行上):
error: 'std::vector' is not a type
(当然,我有包含来自std的矢量!)。有什么建议吗?我摆弄了一段时间,但我已经到了可以使用一些帮助的地步:-)我需要部分专门化初始模板声明,以便我可以根据实际的类型设置编译器开关实现容器C(对于集合将有一个is_in,一个用于向量,一个用于范围......,每次使用不同的算法)。
谢谢!
答案 0 :(得分:6)
标准不允许部分专业化功能模板。
一个简单的解决方案是:使用过载。
template <typename T>
bool is_in(const std::vector<T>& a, const std::vector<T>& b)
{
return false; // implementation tbd
}
这是重载的功能模板。它的部分专业化。
或者,你可以这样做:
namespace detail
{
template<typename T, typename C>
struct S
{
static bool impl(const C & a, const C & b)
{
//primary template
//...
}
}
template<typename T>
struct S<T, std::vector<T> >
{
static bool impl(const std::vector<T> & a, const std::vector<T> & b)
{
//partial specialization for std::vector
return false;
}
}
}
template <typename T, template <class T, class Allocator = std::allocator<T> > class C>
bool is_in(const C<T>& a, const C<T>& b)
{
return detail::S<T, C<T> >::impl(a,b);
}
答案 1 :(得分:1)
功能模板部分特化是不允许。在任何情况下,您都没有使用模板特化语法,实际上您正在编写额外的重载。试试这个:
template <typename T>
bool is_in(const std::vector<T>& a, const std::vector<T>& b)
{
return false; // implementation tbd
}
如果允许部分特化 ,那么它将会是这样的:
template <typename T> // std::vector is not a template parameter,
// so we wouldn't put it here
bool is_in<T, std::vector>(const std::vector<T>& a, const std::vector<T>& b)
// instead, it'd appear ^ here, when we're specializing the base template
{
return false; // implementation tbd
}
答案 2 :(得分:0)
我不知道它是否有效(因为模板模板总是让我心烦意乱),但只是尝试
template <typename T>
bool is_in(const std::vector<T>& a, const std::vector<T>& b)
{
...
}
因为它是专业化的。
编辑:其他人已经对此进行了澄清,但我会将其添加为完整性。上面的代码实际上是一个重载而不是部分特化,但无论如何都不允许部分函数特化。