Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
运算符重载不适用于某些内容,适用于其他内容。。。。链接器错误LNK2019 我试图在C++中重载一些运算符。它们需要重载,因为我创建了一个模板二叉搜索树,它执行大量的相等性检查,并且我的数据对象不是int或string,而是日期_C++_Templates_Linker_Operator Overloading - Fatal编程技术网

运算符重载不适用于某些内容,适用于其他内容。。。。链接器错误LNK2019 我试图在C++中重载一些运算符。它们需要重载,因为我创建了一个模板二叉搜索树,它执行大量的相等性检查,并且我的数据对象不是int或string,而是日期

运算符重载不适用于某些内容,适用于其他内容。。。。链接器错误LNK2019 我试图在C++中重载一些运算符。它们需要重载,因为我创建了一个模板二叉搜索树,它执行大量的相等性检查,并且我的数据对象不是int或string,而是日期,c++,templates,linker,operator-overloading,C++,Templates,Linker,Operator Overloading,我让约会接线员工作得很好。我测试了它们,它们每次都在测试中工作(不是在树中,而是作为主要对象)。然而,我似乎是跳了枪,二元搜索树就是不使用它们。现在,在进一步搜索后,许多消息来源说,我让我的操作员的方式是错误的 我得到的错误是(没有链接到代码行): 下面是一个在Date.cpp中如何使用它们的示例: inline bool operator==(Date &date1, Date &date2) { return ( date1.getD

我让约会接线员工作得很好。我测试了它们,它们每次都在测试中工作(不是在树中,而是作为主要对象)。然而,我似乎是跳了枪,二元搜索树就是不使用它们。现在,在进一步搜索后,许多消息来源说,我让我的操作员的方式是错误的

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

下面是一个在
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);
}
(我的二叉搜索树是基于一个的)

这是树模板中的一个代码示例,说明了自定义运算符无法工作的原因: (const elemType将是我的日期对象)

BinarySearchTree.h
来自:

内联函数的定义必须出现在调用它的转换单元中(不一定在调用点之前)

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

1) It must be declared inline in every translation unit.
这意味着,如果函数定义与调用它们的源文件(第一个引号)不在同一个源文件中,则除非为所有源文件(第二个引号)定义了函数定义,否则它在任何其他源文件中都不可见

解决方案是什么?不要将函数
内联
,或者将它们放入包含在调用函数的所有源文件中的头文件中。

来自:

内联函数的定义必须出现在调用它的转换单元中(不一定在调用点之前)

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

1) It must be declared inline in every translation unit.
这意味着,如果函数定义与调用它们的源文件(第一个引号)不在同一个源文件中,则除非为所有源文件(第二个引号)定义了函数定义,否则它在任何其他源文件中都不可见


解决方案是什么?不要将函数
内联
,或者将它们放入包含在调用函数的所有源文件中的头文件中。

存在两个问题。首先,正如@joachimpileborg所指出的,内联函数必须在使用它们的地方可见。第二,比较函数被声明为接受
const Date&
类型的参数,但被定义为接受
Date&
类型的参数有两个问题。首先,正如@joachimpileborg所指出的,内联函数必须在使用它们的地方可见。其次,比较函数被声明为使用类型为
const-Date&
的参数,但是定义为使用类型为
Date&

的参数时,您是否引用了在同一翻译单元中看不到
inline
关键字的运算符?也许您已将类模板的成员函数的定义降级到
.cpp
文件中?如果是这样,您可能希望将它们移动到页眉。另请参见@CarlNorum,我将如何引用运营商?这是通过包含头文件实现的吗
#在模板中包含“Date.h”
?我记得您说过它们是在
.cpp
文件中实现的。在我看来,@JoachimPileborg已经回答了你的问题。@AndyProwl,标题都在一个文件中,在
.cpp
中一点也没有。(操作符不在树类中,但是,操作符在日期类中,它们在日期类
.cpp
中。您是否引用了那些在同一翻译单元中看不到
内联
关键字的操作符?也许您已将类模板的成员函数的定义降级为
.cpp文件?如果是这样,您可能希望将它们移动到标题。另请参见@CarlNorum,我如何引用运算符?是否包括标题文件?
#包括“Date.h”
在模板中?我以为你说它们是在
.cpp
文件中实现的。在我看来,@JoachimPileborg已经回答了你的问题。@AndyProwl,标题都在一个文件中,而
.cpp
中根本没有。(运算符不在树类中,但是,运算符在日期类中,它们在日期类
.cpp
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)
            {
 ............
BinarySearchTree<int> test;// this works

BinarySearchTree<string> test;// this works too
BinarySearchTree<Date> test;// this does not work
Date tmp(12,12,2000);
Date tmp2(12,12,2000);

cout << (tmp == tmp2) << endl; // this works fine too
1) It must be declared inline in every translation unit.