繁体   English   中英

简单的参数包扩展:预期的';'

[英]Simple parameter pack expansion: expected ';'

在以下代码段中:

void normalize(path& p)
{
   // do something with p
}

template<typename... T>
void normalize(T&... t)
{
     normalize(t)...;  // (L)
}

以我的实际理解,线(L)扩展为:

template<typename... T>
void normalize(T&... t)  // T = {t1, t2, t3}, for example
{
    normalize(t1), normalize(t2), normalize(t3);
}

并且这些表达式中的每一个将执行normalize的一参数版本。 但是, g++ (4.8.1)向我抛出以下错误:

prueba.cpp: In function 'void normalize(T& ...)':
prueba.cpp:155:17: error: expected ';' before '...' token
     normalize(t)...;
             ^
prueba.cpp:155:20: error: parameter packs not expanded with '...':
     normalize(t)...;
                    ^
prueba.cpp:155:20: note:         't'

我的代码有什么问题?

在这种情况下,不允许扩展参数包。 如果创建帮助器类pass ,则可以执行以下操作:

pass{(normalize(std::forward<T>(t)), 0)...};

辅助类pass可能如下所示:

struct pass
{
    template <typename ...Args>
    explicit pass(Args&&...) { }
};

我认为您希望将参数包解压缩到函数调用站点或元组中,如下所示:

  make_tuple(normalize(t)...);  // (L)

例如,以下代码将在gcc-4.8.1下编译:

#include <tuple>
using namespace std;
typedef  int path;
void normalize(path& p)
{
   // do something with p
}

template<typename... T>
void normalize(T&... t)
{
  auto tp = make_tuple(normalize(t)...);  // (L)
  //do whatever you want with the components of tp ...
}

main() {}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM