未定义的引用< ...> (安培; ...)

时间:2016-02-23 15:57:19

标签: c++ rest parameters pack

嗨,我正在研究参数包。我刚刚编写了一个示例代码,但我遇到了一些错误。

代码:

 #include <string>

  using namespace std;

 template<typename T> void inputer(){}

 template<typename T,typename... Rest> void inputer(const T& x, Rest... rest)
{
cin>>x;
inputer<T>(rest...);
}

int main()
{
int a,b;
inputer<int>(a,b);
return 0;
}

我没有看到任何错误(我对参数包没有经验)。 如何获得像我正在尝试的效果。

此致

PS:当我改变

template <typename T> void inputer(){}

template <typename T> void inputer();

代码无法编译。为什么?

2 个答案:

答案 0 :(得分:1)

通过引用传递所有参数。准确地引用非const:

template <typename T, typename... Rest>
void inputer(T& x, Rest&...) { .. }

cin >> x无法修改const int&,如果您按值传递Rest,则输入不会反映在传递的b中,而是反映在参数内包。

  

为什么

template <typename T> void inputer();
     

不编译?

因为必须定义,为什么不呢?如果里面有代码,则会在打印完所有参数后执行。

此外,正如评论中所提到的,没有参数的inputer不需要是模板,只需要重载:

void inputer();

并像这样递言:

inputer(rest...);

T是错误的,如果包的第一个参数与第一个参数不同,它只会破坏整个事物。

答案 1 :(得分:0)

您有多个问题:

void inputer(const T& x, Rest... rest)x是const,因此无法用于cin >> x。此外,rest应作为参考传递。 将其更改为void inputer(T& x, Rest... rest)

inputer<T>(rest...);必须为inputer<Rest&...>(rest...);

您应该检查cin >> x是成功还是失败。

您的inputer始终需要至少一个模板参数。由于它的递归结构,它可能没有任何调用。 您应该为此案例提供解决方案。

工作版

#include <string>
#include <iostream>

using namespace std;

template<typename...Args> bool inputer();

template<typename T, typename... Rest> 
bool inputer(T& x, Rest&... rest)
{
    if (!(cin >> x)) return false;
    return inputer<Rest...>(rest...);
}

template<typename T>
bool inputer(T& x)
{
    if (!(cin >> x)) return false;
    return true;
}


int main()
{
    int a = 0, b = 0;
    inputer<int, int>(a, b);
    return 0;
}