C对列表
在熟悉C STL的同时,我使用对象列表遇到了这个问题.
int count (std::string input,std::vector<std::string> screen){ std::string::iterator it = input.begin(); std::pair<std::string,int> freq[10]; std::list<std::pair<std::string,int> > freq2; freq2.push_back(std::make_pair(*it,0)); //ERR:No instance of fn matches arg list freq2.push_back(std::make_pair('S',0)); //ERR:No instance of fn matches arg list freq2.push_back(std::make_pair("S",0)); //This is fine freq[0] = std::make_pair(*it,0); //This is fine freq[0] = std::make_pair("S",0); //This is fine freq[0] = std::make_pair('S',0); //This is fine return 1; } freq和freq2都非常相似,只是freq2只是一个列表. Freq能够接受字符,字符串和迭代器指针,并且两个对(freq,freq2)都被声明为对.不知道为什么会这样,有什么提示吗?谢谢. 编辑:现在更有意义了,我得到的所有回复都非常有帮助,谢谢你们! 解决方法
类std :: basic_string没有构造函数,其中有一个char类型的参数.这些状态网络无效
freq2.push_back(std::make_pair(*it,0)); //ERR:No instance of fn matches arg list 更准确地说,在这些语句中,尝试构建std :: pair< std :: string,int>类型的对象.来自std :: pair< char,int>类型的对象.这要求类std :: string的构造函数具有char类型的参数.但是没有这样的构造函数. 至于这些陈述 freq[0] = std::make_pair(*it,0); //This is fine 然后使用类std :: basic_string的赋值运算符.该类有一个重载赋值运算符,它接受char类型的对象. basic_string& operator=(charT c); 所以这些陈述是正确的. 请考虑以下示例 #include <iostream> #include <string> #include <utility> int main() { std::pair<std::string,int> p1 = { "a",1 }; std::pair<char,int> p2 = { 'B',2 }; p1 = p2; std::cout << p1.first << 't' << p1.second << std::endl; return 0; } 输出是 B 2 由于类std :: pair有一个模板赋值运算符,而类std :: string又有一个赋值运算符,其参数类型为char,因此该代码编译成功. 如果你愿意写的话 std::pair<std::string,int> p1 = std::make_pair( 'a',1 ); 代替 std::pair<std::string,1 }; 你会得到一个错误,因为std :: pair< char,int>没有转换to std :: pair< std :: string,int>因为没有从char到std :: string的构造函数. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |