微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

请帮助我理解这个“包扩展不包含任何未扩展的参数包”编译器错误

如何解决请帮助我理解这个“包扩展不包含任何未扩展的参数包”编译器错误

template<typename ...>
bool foo(std::tuple<std::string,float> bar...)
{
    std::vector<std::tuple<std::string,float>> barList(bar...);

    // ...
}

这似乎不会产生任何语法错误。编辑器中该行没有错误指示符,但编译器以

停止

[bcc32c Error] Foo.cpp(117): 包扩展不包含任何未扩展的参数包

我尝试在线阅读,但我发现的所有示例要么看起来不完整,要么不清楚。

对于为什么不能编译的简单答案将不胜感激。

解决方法

你的语法错误。您的功能相当于:

bool foo(int bar...)
{
    std::vector<int> barList(bar...);

    // ...
}

请注意,根本没有可变参数模板,也没有什么可解压的 - 相反,您创建了一个 C 样式的可变参数函数。

更改函数的一种最简单方法是:

template<typename... Args>
bool foo(Args... bar)
{
    std::vector<std::tuple<std::string,float>> barList({bar...});

    // ...
}

这并不理想,因为它使您的模板函数变得非常贪婪 - 它很乐意使用任何参数,而不仅仅是字符串和浮点数的元组。

我们可以使用 C++20 concepts

template<class T>
concept Tuple = std::is_same_v<T,std::tuple<std::string,float>>;

template<Tuple... T>
bool foo(T... bar)
{
    std::vector<std::tuple<std::string,float>> barList({bar...});

    // ...
    return true;
}

这允许这样的用法:

foo(std::tuple<std::string,float>{"ddd",20},20});

但不是那样:

foo(10,20,nullptr);

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。