未解析的运算符符号,构建用于排序的类

时间:2014-07-05 20:14:50

标签: c++ hash operator-overloading

编辑:抱歉浪费你的时间。我的问题很简单,我只是在主程序中将变量声明为extern。我认为我的操作员定义是正确的。我确实看到我有其他问题,比如operator = isn' t就在下面。但是,主要问题只是缺失的变量。


我在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;

2 个答案:

答案 0 :(得分:1)

我没有看到您的重载运营商出现任何问题。您的错误与行extern std::map<ipmapclass, int> first;有关。这声明first在其他一些编译单元中定义。是吗?

答案 1 :(得分:1)

代码中的其他错误除了链接器错误的原因外,对于extern符号,必须至少(并且最多)在一个编译单元中声明该符号。在您的情况下,我怀疑这将是impclass.cpp文件中的行:

std::map<ipmapclass, int> first;

这一行将告诉编译器实际创建所需的符号并将其放入impclass.obj文件中供以后链接器使用