[英]Error with variadic templates function: candidate expects 0 arguments, 3 provided
I'm trying to write a static variadic templates constructor for my class. But I'm not so experienced in variadic templates and get an error.我正在尝试为我的 class 编写一个 static 可变参数模板构造函数。但我在可变参数模板方面不是很有经验,因此出现错误。
I wrote the following code:我写了以下代码:
template <typename T> struct scalar {
template <typename... Args> static std::shared_ptr<scalar<T>> create(Args &&...args) {
return std::make_shared<scalar<T>>((std::forward<Args>(args))...);
}
};
template <typename T>
std::shared_ptr<scalar<T>> operator+(std::shared_ptr<scalar<T>> &lhs,
std::shared_ptr<scalar<T>> &rhs) {
auto res = scalar<T>::create(lhs->data + rhs->data, {lhs, rhs}, "+");
res->backward = [lhs, rhs, res]() {
lhs->grad += res->grad;
rhs->grad += res->grad;
};
return res;
}
and I got that error:我得到了那个错误:
error: no matching function for call to ‘red_engine::scalar<double>::create(red_engine::scalar<double>::value_type, <brace-enclosed initializer list>, const char [2])’
143 | auto res = scalar<T>::create(lhs->data * rhs->data, {lhs, rhs}, "*");
| ~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/home/alex/projects/AI/nanograd/nanograd-cpp/engine.hpp:36:46: note: candidate: ‘static red_engine::scalar<T>::pointer red_engine::scalar<T>::create(Args&& ...) [with Args = {}; T = double; pointer = std::shared_ptr<red_engine::scalar<double> >]’
36 | template <typename... Args> static pointer create(Args &&...args) {
| ^~~~~~
/home/alex/projects/AI/nanograd/nanograd-cpp/engine.hpp:36:46: note: candidate expects 0 arguments, 3 provided
Can someone explain me what am I doing wrong?有人可以解释我做错了什么吗? Thank you in advance!先感谢您!
{lhs, rhs}
doesn't have a type, so the respective type in Args...
can't be deduced, and it seems to make the compiler assume Args
is empty, hence candidate expects 0 arguments
. {lhs, rhs}
没有类型,因此无法推断出Args...
中的相应类型,并且它似乎使编译器假定Args
为空,因此candidate expects 0 arguments
。
Use something that does have a type, like MyClass{lhs, rhs}
or MyClass(lhs, rhs)
.使用确实具有类型的内容,例如MyClass{lhs, rhs}
或MyClass(lhs, rhs)
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.