我正在学习c ++模板技术。
我创建了一个带有可变参数模板扩充的构造函数,如下所示。
课程非常简化,所以它没有意义。 但是我无法调用该函数。编译器告诉我它不能直接调用构造函数。
我怎么称呼它?
#include <utility>
class TemplateVariadicAugments {
public:
template <typename FutureInnterTemplateClass, typename... Args>
TemplateVariadicAugments(Args&&... args) : value_(std::forward<Args>(args)...) {}
virtual ~TemplateVariadicAugments() = default;
int value_;
};
void test_variadic_template_augments(void) {
TemplateVariadicAugments a = TemplateVariadicAugments::template TemplateVariadicAugments<int, int>(1);
}
答案 0 :(得分:2)
在您编写的表单中,无法调用构造函数。首先,在C ++中,即使在琐碎的情况下,也无法通过它的名称调用构造函数:
class A
{
public:
A() {}
};
void foo()
{
A::A(); // Illegal.
}
然后,由于您无法直接调用构造函数,因此无法显式实例化模板,因此必须推导出所有模板参数。但在你的情况下FutureInnterTemplateClass
无法推断,因为它在构造函数的任何地方都没有使用。
解决方案是从构造函数中删除多余的参数:
template <typename... Args>
TemplateVariadicAugments(Args&&... args) : value_(std::forward<Args>(args)...) {}
现在可以按如下方式构建对象:
TemplateVariadicAugments obj(1);
在这种情况下,和Args
会被正确推断为int
。
但是在这种情况下,你不清楚你想用可变参数模板参数说什么,好像你构造了一个像这样的对象:
TemplateVariadicAugments obj(1, 2);
您的value_
成员初始化将与此代码等效:
int value_(1, 2);
显然是不合格的。