作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在学习 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);
}
最佳答案
在你写的表单中,没有办法调用构造函数。首先,在 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);
这显然是错误的。
关于c++ - 如何在 C++ 中调用可变参数模板构造函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41733425/
我是一名优秀的程序员,十分优秀!