请帮助我理解这个 "pack expansion does not contain any unexpanded parameter packs" 编译器错误
Please, help me understand this "pack expansion does not contain any unexpanded parameter packs" compiler error
template<typename ...>
bool foo(std::tuple<std::string,float> bar...)
{
std::vector<std::tuple<std::string,float>> barList(bar...);
// ...
}
这似乎没有产生任何语法错误。编辑器中该行没有错误指示器,但编译器以
停止
[bcc32c Error] Foo.cpp(117): pack expansion does not contain any unexpanded parameter packs
我尝试在线阅读,但我找到的所有示例要么看起来不完整,要么我不清楚。
如果能简单回答为什么无法编译,我们将不胜感激。
你的语法有误。您的功能等同于:
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}, std::tuple<std::string, float>{"ddd", 20});
但不是那样的:
foo(10, 20, nullptr);
template<typename ...>
bool foo(std::tuple<std::string,float> bar...)
{
std::vector<std::tuple<std::string,float>> barList(bar...);
// ...
}
这似乎没有产生任何语法错误。编辑器中该行没有错误指示器,但编译器以
停止[bcc32c Error] Foo.cpp(117): pack expansion does not contain any unexpanded parameter packs
我尝试在线阅读,但我找到的所有示例要么看起来不完整,要么我不清楚。
如果能简单回答为什么无法编译,我们将不胜感激。
你的语法有误。您的功能等同于:
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}, std::tuple<std::string, float>{"ddd", 20});
但不是那样的:
foo(10, 20, nullptr);