这样可以编译并正常工作:

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,无法上类。

最佳答案

正如@NathanOliver指出的那样,您的代码既不会使用clang也不会使用gcc进行编译。

实例化以下功能:

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

现在,参数包为空,并且编译器尝试实例化func<>,这导致无法推导模板参数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;
}



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

关于c++ - C++模板包推导-在此示例中我做错了什么?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33129390/

10-10 21:28