运算符重载不适用于某些内容,适用于其他内容。。。。链接器错误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.