请考虑以下代码:
#include <tuple>
template <class Result, class Function, class... Types>
Result f(Function func, Types... values)
{
return std::get<0>(std::make_tuple(func(values)...));
}
template <class... Types>
int g(const Types... values)
{
return std::get<0>(std::make_tuple(f<Types>([](int n){return n;}, values)...));
}
int main()
{
return g(42);
}
在g ++ 4.8.1下,它产生:
mangling.cpp: In instantiation of ‘g(const Types ...) [with Types = int]::__lambda0’:
mangling.cpp:12:50: required from ‘struct g(const Types ...) [with Types = int]::__lambda0’
mangling.cpp:12:77: required from ‘int g(const Types ...) [with Types = int]’
mangling.cpp:17:16: required from here
mangling.cpp:12:57: sorry, unimplemented: mangling argument_pack_select
return std::get<0>(std::make_tuple(f<Types>([](int n){return n;}, values)...));
^
mangling.cpp: In instantiation of ‘struct g(const Types ...) [with Types = int]::__lambda0’:
mangling.cpp:12:77: required from ‘int g(const Types ...) [with Types = int]’
mangling.cpp:17:16: required from here
mangling.cpp:12:57: sorry, unimplemented: mangling argument_pack_select
mangling.cpp:12:57: sorry, unimplemented: mangling argument_pack_select
mangling.cpp:4:8: error: ‘Result f(Function, Types ...) [with Result = int; Function = g(const Types ...) [with Types = {int}]::__lambda0; Types = {int}]’, declared using local type ‘g(const Types ...) [with Types = {int}]::__lambda0’, is used but never defined [-fpermissive]
Result f(Function func, Types... values)
是否有解决方法可以避免此问题?是否已在g ++ 4.8.2或4.9.0中报告和更正?
编辑:我刚刚在这里报告了错误:http://gcc.gnu.org/bugzilla/show_bug.cgi?id=60130答案 0 :(得分:3)
您是否需要为每个扩展参数添加新的lambda?否则,这将解决它:
template <class... Types>
int g(const Types... values)
{
auto func = [](int n){return n;};
return std::get<0>(std::make_tuple(f<Types>(func, values)...));
}