尝试使用可变参数编译代码时出错
error when trying compiling code with variadic parameters
当我尝试编译以下代码时,收到 C2672 和 C2783 错误。
我不知道如何修复它。
class Statement
{
public:
template<typename T, typename ... Args>
void Bind_All(Args... args)
{
std::vector<T> list = { args... };
}
}
void func()
{
Statement stmt;
stmt.Bind_All(1, 2.5, "3");
}
error C2672: 'Statement::Bind_All': no matching overloaded function found
error C2783: 'void Statement::Bind_All(Args...)': could not deduce template argument for 'T'
谢谢!
由于 T
不是参数的一部分,编译器无法推断出 T
。您需要明确说明。
Statement stmt;
stmt.Bind_All<int>(1, 2.5, "3");
但是,请注意,这将不起作用,因为行中有 '"3"cannot be converted to an
int`:
std::vector<T> list = { args... };
您需要在调用 stmt.Bind_All()
时使用合适的参数列表。
下面是如何完成和使用此可变参数模板的示例:
class Statement {
public:
template <typename T>
static void Bind_All(T value) {}
template<typename T,typename ... Args>
static void Bind_All(T value, Args... args)
{
Bind_All(args...);
}
};
void func()
{
Statement stmt;
stmt.Bind_All(1,2.5,"3");
}
int main()
{
func();
return 0;
}
或者,如果您想查看实际使用的不同类型:
#include <iostream>
#include <typeinfo>
class Statement {
public:
template <typename T>
static void Bind_All(T value)
{
std::cout << typeid(value).name() << ":";
std::cout << value << '\n';
}
template<typename T,typename ... Args>
static void Bind_All(T value, Args... args)
{
std::cout << typeid(value).name() << ":";
std::cout << value << '\n';
Bind_All(args...);
}
};
void func()
{
Statement stmt;
stmt.Bind_All(1,2.5,"3");
}
int main()
{
func();
return 0;
}
在我的系统上这会产生:
int:1
double:2.5
char const * __ptr64:3
当我尝试编译以下代码时,收到 C2672 和 C2783 错误。 我不知道如何修复它。
class Statement
{
public:
template<typename T, typename ... Args>
void Bind_All(Args... args)
{
std::vector<T> list = { args... };
}
}
void func()
{
Statement stmt;
stmt.Bind_All(1, 2.5, "3");
}
error C2672: 'Statement::Bind_All': no matching overloaded function found
error C2783: 'void Statement::Bind_All(Args...)': could not deduce template argument for 'T'
谢谢!
由于 T
不是参数的一部分,编译器无法推断出 T
。您需要明确说明。
Statement stmt;
stmt.Bind_All<int>(1, 2.5, "3");
但是,请注意,这将不起作用,因为行中有 '"3"cannot be converted to an
int`:
std::vector<T> list = { args... };
您需要在调用 stmt.Bind_All()
时使用合适的参数列表。
下面是如何完成和使用此可变参数模板的示例:
class Statement {
public:
template <typename T>
static void Bind_All(T value) {}
template<typename T,typename ... Args>
static void Bind_All(T value, Args... args)
{
Bind_All(args...);
}
};
void func()
{
Statement stmt;
stmt.Bind_All(1,2.5,"3");
}
int main()
{
func();
return 0;
}
或者,如果您想查看实际使用的不同类型:
#include <iostream>
#include <typeinfo>
class Statement {
public:
template <typename T>
static void Bind_All(T value)
{
std::cout << typeid(value).name() << ":";
std::cout << value << '\n';
}
template<typename T,typename ... Args>
static void Bind_All(T value, Args... args)
{
std::cout << typeid(value).name() << ":";
std::cout << value << '\n';
Bind_All(args...);
}
};
void func()
{
Statement stmt;
stmt.Bind_All(1,2.5,"3");
}
int main()
{
func();
return 0;
}
在我的系统上这会产生:
int:1
double:2.5
char const * __ptr64:3