4 c++ constructor stl list std-pair
在熟悉 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;
}
Run Code Online (Sandbox Code Playgroud)
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
freq2.push_back(std::make_pair('S',0)); //ERR:No instance of fn matches arg list
Run Code Online (Sandbox Code Playgroud)
更准确地说,在这些语句中,试图std::pair<std::string, int>
从 type 的对象构建 type 的对象std::pair<char, int>
。这要求类的构造函数具有std::string
类型的参数char
。然而没有这样的构造函数。
至于这些说法
freq[0] = std::make_pair(*it,0); //This is fine
freq[0] = std::make_pair('S',0); //This is fine
Run Code Online (Sandbox Code Playgroud)
然后使用了类 的赋值运算符std::basic_string
。该类有一个重载的赋值运算符,它接受类型的对象char
。
basic_string& operator=(charT c);
Run Code Online (Sandbox Code Playgroud)
所以这些说法都是正确的。
考虑下面的例子
#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;
}
Run Code Online (Sandbox Code Playgroud)
输出是
B 2
Run Code Online (Sandbox Code Playgroud)
由于类std::pair
具有模板赋值运算符,而类std::string
又具有具有 char 类型参数的赋值运算符,因此该代码可以成功编译。
例如,如果你写
std::pair<std::string, int> p1 = std::make_pair( 'a', 1 );
Run Code Online (Sandbox Code Playgroud)
代替
std::pair<std::string, int> p1 = { "a", 1 };
Run Code Online (Sandbox Code Playgroud)
你会得到一个错误,因为没有从std::pair<char, int>
to 的转换std::pair<std::string, int>
,因为没有char
to的构造函数std::string
。
没有隐式构造函数std::string
接受char
并可用于将类型转换char
为std::string
. 你可以使用这个构造函数:
basic_string( size_type count, CharT ch, const Allocator& alloc = Allocator() );
所以
freq2.push_back(std::make_pair( std::string( 1, *it ),0));
Run Code Online (Sandbox Code Playgroud)
等等
归档时间: |
|
查看次数: |
42590 次 |
最近记录: |