【发布时间】:2023-04-07 22:34:01
【问题描述】:
如果参数列表绑定到一个类,我不明白参数包必须位于参数列表末尾的原因,而如果参数列表是成员方法声明的一部分,则放宽约束。
换句话说,这个编译:
class C {
template<typename T, typename... Args, typename S>
void fn() { }
};
以下一项没有:
template<typename T, typename... Args, typename S>
class C { };
为什么第一种情况被认为是正确的,而第二种情况则不是?
我的意思是,如果它是合法的语法,不应该在这两种情况下都适用吗?
要清楚,真正的问题是我定义了一个类似于以下的类:
template<typename T, typename... Args, typename Allocator>
class C { };
将分配器类型作为最后一种类型将不胜感激,但我可以以某种方式解决它(无论如何,如果您有任何建议,我们将不胜感激,也许您的建议比我的要优雅得多!)。
也就是说,我得到了错误:
参数包'Args'必须在模板参数列表的末尾
所以,我只是想完全理解为什么它在某些情况下被接受,但在其他一些情况下却不是。
Here 是一个类似的问题,但它只是解释了如何解决问题,这对我来说很清楚。
【问题讨论】:
-
您使用的是最后一个类型参数的默认值——据我回忆,这改变了很多。 (但我忘记了细节)。或许您应该在两个开场示例中都包含默认值?
-
您能举例说明您打算如何调用这些模板吗?我不确定它是否非常相关,但它可能会有所帮助
-
对不起,默认参数出错,不再存在。我打算像使用其他模板一样使用该模板:
C<int, float, std::allocator<int>>。问题在于该语法适用于成员方法,但不适用于类定义,我不明白为什么不这样做!
标签: c++ templates c++11 variadic-templates