【问题标题】:error when trying compiling code with variadic parameters尝试使用可变参数编译代码时出错
【发布时间】:2016-04-25 20:07:28
【问题描述】:

当我尝试编译以下代码时,我收到 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");
}

错误 C2672:'Statement::Bind_All':找不到匹配的重载函数

错误 C2783: 'void Statement::Bind_All(Args...)': 无法推导出 'T' 的模板参数

谢谢!

【问题讨论】:

  • 嗯,它是说它不能推断出T,这是有道理的,因为参数中没有任何东西依赖于T。告诉它;也就是说,你认为T 应该在这里吗?您在参数中混合了不同的类型。
  • 你也忘了在类声明后加分号。

标签: c++ templates compiler-errors variadic


【解决方案1】:

由于T 不是参数的一部分,因此编译器无法推断出T。您需要明确说明。

Statement stmt;
stmt.Bind_All<int>(1, 2.5, "3");

但是,请注意,这将不起作用,因为 '"3"cannot be converted to anint` 在该行中:

std::vector<T> list = { args... };

在调用stmt.Bind_All() 时,您需要使用合适的参数列表。

【讨论】:

  • 谢谢!但是如果我想传入各种类型的参数呢?
  • @XTT,当你想构造一个std::vector&lt;int&gt;时,你需要传递ints或任何可以隐式转换为int的东西。您不能使用任何旧类型的对象作为参数来构造 std::vector&lt;int&gt;
【解决方案2】:

以下是如何完成和使用此可变参数模板的示例:

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

【讨论】:

    猜你喜欢
    • 2022-10-02
    • 2023-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多