我有一个课程模板
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
有没有办法实现我想做的事情?谢谢!
答案 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;
}