【问题标题】:C++ String Split function Error in Eclipse but CompilesEclipse中的C ++字符串拆分函数错误但可以编译
【发布时间】:2012-07-21 14:57:50
【问题描述】:

Eclipse 在 push_back 行上显示以下错误:

无效参数' 候选人是: void push_back(const std::basic_string<char,std::char_traits<char>,std::allocator<char>> &)

我的问题是,如何确保向量包含字符串而不是 basic_strings?

我在另一段代码中发现我想访问这个向量,但我在编译它时遇到了麻烦,它似乎后来知道在当前上下文中它是一个 basic_string 而不是“std::string”我知道我只会使用 char 但我想将超类保留在那里,以便将来如果我换成 w-char 等,我不必调整任何东西。

我已经尝试将其转换为字符串,但这似乎不起作用

 std::string test = (std::string)tokens[1];

最终目标是用该向量构造一些对象

if(tokens->size() == 3){
TestObject test = new TestObject(tokens[1],)tokens[2])
}

这是我在 Stackoverflow 上找到的函数,由 stackoverflow 用户提出 Function Origin

感谢您的帮助。

void TestClass::splitString(const std::string &str, std::vector<std::string>* tokens){
    boost::char_separator<char> sep(",");

    std::string separator;
    boost::tokenizer< boost::char_separator<char> > tok(str,sep);
    for(boost::tokenizer< boost::char_separator<char> >::iterator it=tok.begin(); it != tok.end(); ++it)
    {    
      tokens->push_back(*it);
    }    
}

没有匹配函数调用‘TestObject::defineX(std::basic_string*)’

accessing with defineX(vector[1].data());

没有匹配函数调用‘TestObject::defineX(std::vector >&)’

accessing with defineX(vector[1]);

函数的定义声明如下(也许这是问题所在?):

typedef std::string td_MAP_KEY;
td_MAP_VALUE * TestObject::defineX(td_MAP_KEY key);

我这样调用方法,如果你想编译它,它应该可以工作,不幸的是我无法在这里粘贴完整的代码,但下面的代码应该这样做:

std::string x = "one,two,three,four"
std::vector<std::string> * splittedString = new std::vector<std::string>;
splitString(x,splittedString);
TestObject * object = new TestObject();
object->defineX(splittedString[1]);

【问题讨论】:

  • std::stringstd::basic_string&lt;char,std::char_traits&lt;char&gt;,std::allocator&lt;char&gt;&gt; 的类型定义
  • 你得到的错误函数在哪里?是那个 splitString 函数吗?因为它对我来说很好用。
  • @BenjaminLindley 当我尝试直接访问此向量中的元素时出现错误,因为它会给我一个 basic_string 并且编译器会抱怨它不是 std::string,我相信它不是语法错误,但按照数组中的定义,它应该是 std::string 而不是 basic_string,强制转换也没有帮助,此外我不确定,因为我们在本地构造标记器,但将指针地址传递给向量,在函数之后它将被破坏,除了 push_back 会复制它。
  • 请给出一个完整的例子来说明问题,而不是英文描述。就像我说的,std::stringstd::basic_string 的一种形式,所以说“它应该是std::string 而不是basic_string”没有任何意义
  • @BenjaminLindley 我已经添加了你想要的代码,如果你也编译它,我有 g++ 4.6.3

标签: c++ string boost split


【解决方案1】:

这段代码的问题:

std::vector<std::string> * splittedString = new std::vector<std::string>;
    :
object->defineX(splittedString[1]);

是您将splittedString 定义为向量指针,并将其指向单个向量(而不是向量数组),然后尝试访问(不存在的)向量数组的第二个元素。你可能想要

object->defineX((*splittedString)[1]);

它取消引用向量指针,然后抓取向量的第二个元素。

【讨论】:

    猜你喜欢
    • 2019-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-28
    • 1970-01-01
    相关资源
    最近更新 更多