C++ 模板包推导——我在这个例子中做错了什么?

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

这编译并工作正常:

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;
}

live example

输出

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

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

相关文章:

c++ - 调用模板类成员时非法使用此类型作为表达式

c++ - MSVC 中的折叠表达式

c++ - 在 C++11 中实现 std::tuple 的字典序比较

c++ - 理解可变参数模板函数

c++ - 奇怪的 CUDA 错误输出

c++ - 输入迭代器跳过空格,任何防止这种跳过的方法

c++ - 如何使用 ffmpeg 将 3840 nb_samples 编码为需要 1024 的编解码器

c++ - std::next_permutation Implementation Explanation 似乎有点低效?

c++ - 基于指针类型的模板函数重载?

javascript - 直接从空格键访问模板实例对象属性