0

我正在尝试在 C++ 中重载一些运算符。它们需要重载,因为我创建了一个模板二叉搜索树,它进行了大量的相等性检查,而且我的数据对象不是整数或字符串,而是日期。

我让日期操作员工作得很好。我对它们进行了测试,它们每次都在测试中工作(不是在树中,而是在主对象中)。然而,似乎我跳了枪,二叉搜索树就不会使用它们。现在经过进一步搜索,很多消息来源都说我制作运营商的方式是错误的。

我得到的错误是(没有链接到一行代码):

1>DataStore.obj : error LNK2019: unresolved external symbol "bool __cdecl operator==(class Date const &,class Date const &)" (??8@YA_NABVDate@@0@Z) referenced in function "public: void __thiscall BinarySearchTree<class Date>::insert(class Date const &)" (?insert@?$BinarySearchTree@VDate@@@@QAEXABVDate@@@Z)
1>DataStore.obj : error LNK2019: unresolved external symbol "bool __cdecl operator>(class Date const &,class Date const &)" (??O@YA_NABVDate@@0@Z) referenced in function "public: void __thiscall BinarySearchTree<class Date>::insert(class Date const &)" (?insert@?$BinarySearchTree@VDate@@@@QAEXABVDate@@@Z)
1>Z:\Dropbox\University\ICT209 - Data Structures\Assignment2\StockDataTree\Debug\StockDataTree.exe : fatal error LNK1120: 2 unresolved externals

好吧,这些是我里面的运营商Date.h

friend bool operator==(const Date &date1, const Date &date2);
friend bool operator!=(const Date &date1, const Date &date2);
friend bool operator<(const Date &date1, const Date &date2);
friend bool operator<=(const Date &date1, const Date &date2);
friend bool operator>(const Date &date1, const Date &date2);
friend bool operator>=(const Date &date1, const Date &date2);

以下是它们如何在以下应用中使用的示例Date.cpp

inline bool operator==(Date &date1, Date &date2)
{
    return 
        (
        date1.getDay() == date2.getDay() &&
        date1.getMonth() == date2.getMonth() &&
        date1.getYear() == date2.getYear()
        );
}

inline bool operator!=(const Date &date1, const Date &date2)
{
    return !(date1 == date2);
}

(我的二叉搜索树基于C++ Programming: Program Design Include Data Structures中的一个)

这是树模板中的代码示例,用于说明为什么我的自定义运算符不起作用:(const elemType 将是我的日期对象)

BinarySearchTree.h<-- 这是一个模板

template <class elemType>
void BinarySearchTree<elemType>::insert(const elemType& insertItem)
{
    nodeType<elemType> *current;
    nodeType<elemType> *trailCurrent;
    nodeType<elemType> *newNode;

    newNode = new nodeType<elemType>;
    newNode->info = insertItem;
    newNode->lLink = NULL;
    newNode->rLink = NULL;

    if (root == NULL)
        root = newNode;
    else
    {
        current = root;

        while (current != NULL)
        {
            trailCurrent = current;

            if (current->info == insertItem)
            {
 ............

编辑:这棵树也可以作为intor正常工作string,没有问题。

BinarySearchTree<int> test;// this works

BinarySearchTree<string> test;// this works too

问题仅在我将树与我自己的日期类一起使用时。

BinarySearchTree<Date> test;// this does not work

Date 类运算符也在树中工作,main.cpp但不在树中。

Date tmp(12,12,2000);
Date tmp2(12,12,2000);

cout << (tmp == tmp2) << endl; // this works fine too
4

2 回答 2

2

有两个问题。首先,正如@joachimileborg 指出的那样,内联函数必须在使用它们的地方可见。其次,比较函数被声明为接受 type 的参数const Date&,但定义为接受 type 的参数Date&

于 2013-05-26T18:17:41.537 回答
2

这个参考

内联函数的定义必须存在于调用它的翻译单元中(不一定在调用点之前)。

3) 具有外部链接的内联函数(例如未声明为静态)具有以下附加属性:

1) It must be declared inline in every translation unit.

这意味着,如果函数定义与您调用它们的位置不同(第一个引号),它在任何其他源文件中都不会可见,除非它们是为所有源文件定义的(第二个引号)。

解决方案?要么不创建函数inline,要么将它们放在一个头文件中,该头文件包含在调用函数的所有源文件中。

于 2013-05-26T18:01:42.800 回答