【问题标题】:too few arguments for class template "std::pair" : Passing std pair as arguments in varidiac function类模板“std::pair”的参数太少:在可变参数函数中将标准对作为参数传递
【发布时间】:2018-05-04 06:01:43
【问题描述】:

我必须将 std::pairstd::string 传递给可变参数函数。 std::pair 在尝试使用 va_arg 宏访问 std::pair 时显示错误 too few arguments for class template "std::pair"

#include <stdarg.h>
#include <tuple>
#include <string>
using std::pair;
using std::string;

bool EncodeJSonData(pair<string,string> inbulkData ...)
{     
    va_list args; 
    va_start(args, inbulkData);
    int count = 5;
    while(count--)
    { 
        pair<string,string> bulkData;
        bulkData = va_arg(args, pair<string,string>);  //here is the error      
    }
    va_end(args); 

    return true;
}

这里缺少什么,

【问题讨论】:

  • 您是否考虑过传递成对的容器(例如向量)? C 可变参数函数将允许用户传递他们想要的任何类型,而编译器不会捕获它。此外,它不保证适用于 C++ 字符串(包括这样的对)和大多数其他有趣的类。
  • 请不要在 C++ 中使用可变参数函数。相反,请使用至少类型安全的可变参数模板。
  • 包括所有需要的标题。
  • 应该如何终止?阅读:minimal reproducible example
  • 没有可移植的方式来使用可变参数来传递std::pair&lt;std::string,std::string&gt;。类型是不平凡的。 Vararg是过去的遗物。使用可变参数模板。

标签: c++ stl variadic-functions variadic-macros


【解决方案1】:

va_arg是宏,','这样的字符可能会导致宏解析失败

所以解决方法是 typedef pair&lt;string,string&gt;:

    typedef pair<string, string> StrStrPair;
    StrStrPair bulkData;
    bulkData = va_arg(args, StrStrPair);

【讨论】:

  • 没有可移植的方式来使用可变参数来传递 std::pair<:string>。类型很重要。
猜你喜欢
  • 2013-05-25
  • 2014-10-20
  • 2016-05-03
  • 2020-06-07
  • 2015-09-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-16
相关资源
最近更新 更多