我需要使用另一个模板类中定义的模板类作为另一个模板的参数作为模板方法中的返回值。我知道这听起来很复杂,下面的代码更好地解释了它。问题是代码无法编译,它以下列错误结束:
type/value mismatch at argument 2 in template parameter list for 'template<class T, template<class> class Policy> class Result'
expected a class template, got 'CDummy<T2>::Policy2'
但我很确定给定的课程满足了需求。问题是使用它的方法也是模板,因此编译器不知道究竟是什么CDummy<T2>::Policy2
。如果Policy2
不是模板,而是常规类或者我可以填写其参数,我会使用typename
来告诉编译器不要担心它,但是如何用模板完成?
// I cannot change this interface - it's given by a library
template <class T, template <class> class Policy>
class Result : public Policy<T>
{
T data;
};
template <class T>
class Policy1
{
};
// I use this for allowing Policy2 to change behaviour according Dummy
// while it keeps template interface for class above
template <class Dummy>
class CDummy
{
public:
template <class T>
class Policy2 : public Policy1<T>
{
};
};
// Both variables are created ok
Result<int, Policy1 > var1;
Result<int, CDummy<float>::Policy2 > var2;
// This is ok, too
template <class T>
Result<T, Policy1 > calc1()
{
return Result<int, Policy1>();
}
// But this ends with the error:
// type/value mismatch at argument 2 in template parameter list for 'template<class T, template<class> class Policy> class Result'
// expected a class template, got 'CDummy<T2>::Policy2'
template <class T1, class T2>
Result<T1, CDummy<T2>::Policy2 > calc2() // <-- Here is the generated error
{
typedef typename DummyTypedef CDummy<T2>;
return Result<T1, DummyTypedef::Policy2>();
}
注意:
答案 0 :(得分:3)
我认为名称CDummy<T2>::Policy2
是该上下文中的从属名称,您应该使用template
关键字来通知编译器它确实是一个模板。
template <class T1, class T2>
Result<T1, CDummy<T2>::template Policy2 > calc2() // <-- Here is the generated error
// ^^^^^^^^
另外,同样功能的实现似乎也是错误的。 typedef
s的顺序是原始名称,新名称,并且CDummy<T2>
已知是一种类型(即不需要typename
):
typedef CDummy<T2> DummyTypedef;
返回语句将是:
return Result<T1, DummyTypedef::template Policy2>();