类模板部分特化

时间:2014-05-06 15:36:36

标签: c++ templates

我有一个课程模板

class Class1;

template <class L, template<class> class F>
class N : public Class1, public F<L>
{ .... }

现在我想通过以下方式对其进行部分专门化:

template <class L>
class S;

template <class L>
class N<L, S<L> > : public Class1
{ .... }

但是我在GCC中遇到以下错误:

type/value mismatch

有没有办法实现我想做的事情?谢谢!

3 个答案:

答案 0 :(得分:2)

在这一行:

class N<L, S<L> > : public Class1

S<L>不是模板。将其更改为S,它将进行编译。

答案 1 :(得分:2)

您传入了一个类,而不是模板作为N专精的第二个参数。我进行了一些更改以便进行编译(主要从专业化中删除<L>):

class Class1 {};

template <class L, template<class> class F>
class N : public Class1, public F<L>
{  };

template <class L>
class S;

template <class L>
class N<L, S > : public Class1
{  };

答案 2 :(得分:1)

gcc 4.8.1输出

error: type/value mismatch at argument 2 in template parameter list for ‘template<class L, template<class> class F> class N’
 class N<L, S<L> > : public Class1
                 ^
test.cpp:14:17: error:   expected a class template, got ‘S<L>’

不要明确专门化S,只需:

template <class L>
class N<L, S> : public Class1 { };

工作示例:

class Class1 {};

template <class L, template<class> class F>
class N : public Class1, public F<L> { };

template <class L>
class S;

template <class L>
class N<L, S> : public Class1 { };

int main () {}

编辑:我的猜测是你可能希望能够写出像

这样的内容
int main ()
{
    N<int> n;
}

但是上面的代码不能编译:

error: wrong number of template arguments (1, should be 2)
  N<int> n;
       ^
error: provided for ‘template<class L, template<class> class F> class N’
 class N : public Class1, public F<L>
       ^
error: invalid type in declaration before ‘;’ token
  N<int> n;

您应该忘记专业化并使用默认模板参数:

template <class L, template<class> class F = S>
class N : public Class1, public F<L> { };

工作示例:

class Class1 {};

template <class L>
class S {};

template <class L, template<class> class F = S>
class N : public Class1, public F<L> {};

int main ()
{
    N<int> n;
}