【问题标题】:C++ template pack deduction - What am I doing wrong in this example?C++ 模板包推导 - 在这个例子中我做错了什么?
【发布时间】:2015-10-14 15:23:42
【问题描述】:

这编译和工作正常:

template<typename T, typename ... Args>
void func()
{
    std::cout << __PRETTY_FUNCTION__ << std::endl;
    func<Args...>();
}

int main()
{
    func<int, char, float>();
    return 0;
}

...这也可以编译并正常工作:

struct Object {};   // Some dummy object

template<typename T, typename ... Args>
void func(Object *a)
{
    std::cout << __PRETTY_FUNCTION__ << std::endl;
    func<Args...>(a);
}

int main()
{
    Object *a = new Object;
    func<int, char, float>(a);
    return 0;
}

...但这不会编译,因为它无法解析 T:

struct Object {};   // Some dummy object

template<typename T, typename ... Args>
void func(Object *a, Object *b)
{
    std::cout << __PRETTY_FUNCTION__ << std::endl;
    func<Args...>(a, b);
}

int main()
{
    Object *a = new Object;
    Object *b = new Object;
    func<int, char, float>(a, b);
    return 0;
}

我在这里做错了什么?抱歉无法使用 Ideone,无法工作。

【问题讨论】:

标签: c++ templates variadic-templates variadic type-deduction


【解决方案1】:

正如@NathanOliver 所指出的,您的代码既不能使用clang 也不能使用gcc 编译。

以下函数被实例化:

func<int, char, float>()
func<char, float>()
func<float>()

现在,参数包为空,编译器尝试实例化func&lt;&gt;,导致模板参数T无法推导错误。

为了正确结束递归,可以使用this SO question的答案之一,例如:

#include <iostream>

template <typename Last>
void func()
{
    std::cout << __PRETTY_FUNCTION__ << std::endl;
}

template<typename First, typename Second, typename ... Args>
void func()
{
    std::cout << __PRETTY_FUNCTION__ << std::endl;
    func<Second, Args...>();
}

int main()
{
    func<int, char, float>();
    return 0;
}

live example

输出

void func() [First = int, Second = char, Args = <float>]
void func() [First = char, Second = float, Args = <>]
void func() [Last = float]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-02-15
    • 2017-05-09
    • 1970-01-01
    • 2022-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多