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