我有以下结构:C++ 11:可变参数模板演绎逻辑
template <class... Args>
class some_class
{
public:
some_class() = default;
some_class(Args...) = delete;
~some_class() = default;
};
template<>
class some_class<void>
{
public:
some_class() = default;
~some_class() = default;
};
这样做的原因是,我只是想允许用户创建一个使用默认的构造函数的对象,因此,例如:
some_class<int,float> b;
应该工作,但
some_class<int,float> c(1,3.4);
应该给我一个编译错误。
在某个时间点上我还需要创建模板上void
基础,因此,专业化的void
:
some_class<void> a;
但错误我已经输入:
some_class<> d;
突然,我的代码停止编译,它给了我错误:
some_class<Args>::some_class(Args ...) [with Args = {}]’ cannot be
overloaded
some_class(Args...) = delete;
所以这里出现了这样的问题:我觉得我错了,我认为some_class<>
应该推导为void
专业化......我只是不知道为什么。可以请某人解释为什么some_class<>
(即:空参数列表)不同于some_class<void>
? (从标准几行会做:))
谢谢,你的回答完美地解释了情况...我原来的问题是有点高于这个水平,因为我使用参数包作为类的一些功能的参数类型(所以我自动将'void'翻译成不带参数的东西),我甚至有这种情况,当具体的值是从参数包中实例化,所以由于这种限制,我实际上从来没有想过把''放在那里,但实际上这个答案清楚地描述了情况。 –
fritzone