我在20年内没有使用过载运算符。所以,我相当生疏。但是,我的目标是能够构建地图,哈希映射或未排序的映射,我可以在其中存储和检索IPv6地址的内部ID整数。哪种结构最适合我的目的,我可以接受建议。我想我先试试地图,但是,如果这不是最好的选择,请告诉我。我告诉我应用程序的要求最多需要100,000个IPv6地址。虽然我也告诉它,至少一年或两年内它可能不会超过10,000。在任何情况下,我的目标是,当提交IPv6地址时,我想快速找到该地址的内部ID号。
所以,基本上,我的理解是,为了能够使用地图类,我需要提供一个<运营商。而且,在此期间,我不妨提供其余的比较运算符。起初,我创建的运算符不是友元函数,只有一个看到的运算符,我得到一个编译器错误,说它正在寻找一个带有两个操作数的运算符。我在这里搜索了答案,找到了这个问题的答案,我把它变成了朋友的功能。这一次,我没有收到编译错误。但是,我收到一个链接器错误:
LNK2001:未解析的外部符号" class std :: map,class std :: allocator> >第一" (?第一@@ 3V?$地图@ @@ Vipmapclass HU?$ @少@@@ Vipmapclass STD @@ V'$分配器@ U&$ @配对$$ CBVipmapclass @@ H + STD @@@ 3 @@性病@@ A)c:\ Projects \ mapdemo \ mapdemo \ mapdemo.obj mapdemo
我在x64模式下使用Visual Studio 2010,但是,我也希望代码能够与VS 2008 x64一起使用。我使用这里是我下面课程的代码。谢谢你的帮助!
#include "targetver.h"
#include <stdio.h>
#include <stddef.h>
#include <tchar.h>
#include <conio.h>
#include <map>
#include <windows.h>
#include <In6addr.h>
#include <InAddr.h>
class ipmapclass{
public:
union{
in6_addr ip6addr;
unsigned _int64 uint64[2];
};
inline friend bool operator==(const ipmapclass& lhs, const ipmapclass& rhs)
{
return ( (lhs.uint64[0] == rhs.uint64[0]) &&
(lhs.uint64[1] == rhs.uint64[1]) );
}
inline friend bool operator< (const ipmapclass& lhs, const ipmapclass& rhs)
{
return ( (lhs.uint64[0] < rhs.uint64[0]) ||
((lhs.uint64[0] == rhs.uint64[0]) && (lhs.uint64[1] < rhs.uint64[1])) );
}
inline ipmapclass operator= (const ipmapclass& rhs)
{
ipmapclass result;
result.uint64[0] = rhs.uint64[0];
result.uint64[1] = rhs.uint64[1];
return (result);
}
inline friend bool operator> (const ipmapclass& lhs, const ipmapclass& rhs){return rhs < lhs;}
inline friend bool operator<=(const ipmapclass& lhs, const ipmapclass& rhs){return !(lhs > rhs);}
inline friend bool operator>=(const ipmapclass& lhs, const ipmapclass& rhs){return !(lhs < rhs);}
};
extern std::map<ipmapclass, int> first;
答案 0 :(得分:1)
我没有看到您的重载运营商出现任何问题。您的错误与行extern std::map<ipmapclass, int> first;
有关。这声明first
在其他一些编译单元中定义。是吗?
答案 1 :(得分:1)
代码中的其他错误除了链接器错误的原因外,对于extern
符号,必须至少(并且最多)在一个编译单元中声明该符号。在您的情况下,我怀疑这将是impclass.cpp
文件中的行:
std::map<ipmapclass, int> first;
这一行将告诉编译器实际创建所需的符号并将其放入impclass.obj
文件中供以后链接器使用