我正在尝试将两个字符串与存储在map<string,IPHost> Address_list
内的IP地址进行比较。我是C ++的新手,我认为我在标题和实现文件方面做错了。这是我到目前为止所写的内容。当我编译它时,它说:
error: no matching function for call to 'IPHost::IPHost()`
有人可以指导我如何修复它吗?
这是我的头文件:
#ifndef IPHOST_H
#define IPHOST_H
#include <iostream>
class IPHost
{
public:
IPHost(int ip0, int ip1, int ip2, int ip3);
bool checkIP(const IPHost&) const;
private:
int one;
int two;
int three;
int four;
};
#endif
这是我的实施文件:
#include "IPHost.h"
#include <iostream>
#include <string>
using namespace std;
IPHost::IPHost(int ip0, int ip1, int ip2, int ip3 )
{
ip0=one;
ip1=two;
ip2=three;
ip3=four;
}
bool IPHost::checkIP(const IPHost& h)const
{
if(one == h.one && two == h.two && three == h.three && four == h.four)
{
return true;
}
else
{
return false;
}
}
我的主要职能是:
#include <iostream>
#include <string>
#include <map>
#include "IPHost.h"
using namespace std;
int main
{
map<string, IPHost> Address_list;
Address_list["google.com"]=IPHost(74,125,225,20);
Address_list["m.twitter.com"]=IPHost(199,16,156,43);
if (Address_list["google.com"].checkIP(Address_list["m.twitter.com"]))
{
cout << "Two IP address are the same.\n";
}
else
{
cout << "Two IP address do not match.\n";
}
return 0;
}
答案 0 :(得分:5)
当你这样说时:
Address_list["google.com"]=IPHost(74,125,225,20);
std::map::operator[]
默认构造一个IPHost
对象,然后通过引用返回,然后复制 - 为该对象分配一个临时IPHost
。编译器抱怨,因为IPHost
没有默认构造函数,因此std::map::operator[]
方法实现无法实例化。
(这是必需的,因为语法不允许std::map
知道您尝试分配的值;它只知道您想要访问可能不存在的密钥"google.com"
,所以它需要创建一个IPHost
对象,以便为它赋值。默认构造是唯一合理的选择。)
如果要使用以下语法,则需要为IPHost
提供默认构造函数:
public: IPHost();
// Later...
IPHost::IPHost() : one(0), two(0), three(0), four(0) { }
或者,您可以改为使用std::map::insert
,这不需要值类型是默认构造的,因为您直接提供IPHost
对象作为值。
Address_list.insert(std::pair<std::string const, IPHost>(
"google.com", IPHost(74,125,225,20)));
如果您有权访问C ++ 11,那么使用std::map::emplace
可以使此操作更有效,更简洁:
Address_list.emplace("google.com", IPHost(74,125,225,20));
请注意,如果已找到密钥,insert
和emplace
将不会替换该值!如果需要,您应该检查insert
或emplace
调用的返回值,该调用包含映射中元素的迭代器和bool,指示它是否创建了项目。这样,就a[b] = c
语法对地图内容的影响而言,它们与IPHost
语法不完全相同。
如果您经常发现自己试图在地图中设置值而不考虑该密钥是否已存在,我强烈建议您向a[b] = c
添加默认构造函数,因为它会使更简单{{1}}语法可能,并防止您必须编写更复杂的if-item-already-exists-then-update-it-instead case。