重载类定义之外的运算符

Overloading operators outside of class definition

本文关键字:运算符 定义 重载      更新时间:2023-10-16

我想重载operator-以给出作为参数传递的两个迭代器之间的距离。

我的类

是一个列表,我的列表中嵌套了迭代器类。

我似乎无法获得函数的正确形式。我没有机会测试身体。我对函数的主要问题是我如何定义它。

size_t operator-(template <class T> typename mylist<T>::iterator a, template <class T> typename mylist<T>::iterator b) {
    size_t i = 0;
    while(a.node != b.node) {
        ++a;
        ++i;
    }
    return i;
}

正确的定义应该是这样的:

template <class T>
size_t operator-(const mylist<T>::iterator& a, const mylist<T>::iterator& b) {
   ... put logic here... 
}

operator-不应该修改其参数,而您的参数会修改,这通常不是很好。您可以通过传递参数的副本来解决此问题:

template <class T>
size_t operator-(mylist<T>::iterator a, mylist<T>::iterator b) {
   ... put logic here... 
}

您应该研究如何正确模板化函数。

template<class T>
void function(const T& t) { ... }
template <class T>
size_t operator-(typename mylist<T>::iterator a, typename mylist<T>::iterator b) 
{
    size_t i = 0;
    while(a.node != b.node) {
        ++a;
        ++i;
    }
    return i;
}

template <class Iterator>
size_t operator-(Iterator & a, const Iterator & b) 
{
    size_t i = 0;
    while(a.node != b.node) {
        ++a;
        ++i;
    }
    return i;
}

请注意迭代器上不会更改的引用和常量(如果不希望它更改,则可能不希望传递 BY 引用。