为什么我不能在课堂之外定义模板的朋友?

时间:2019-08-13 22:11:58

标签: c++ templates friend

我正在阅读有关STL容器的信息,所以当我到达关系运算符时如何使用它们:我发现当比较两个相同类型的容器时,这些容器使用了Element Type Relational Operator,所以我想打破规则并定义一个不依赖于元素类型提供的操作的关系运算符。

#include <iostream>



template<class T>
class Vector {
    public:
        using size_type = unsigned int;

        Vector() = default;
        Vector(size_type, T = T());

        size_type size()const { return sz_; }
        T* elem()const { return elem_; }

        ~Vector();

        friend bool operator < (const Vector<T>& x, const Vector<T>& y);

    private:
        T* elem_ = nullptr;
        size_type sz_ = 0;
};

template<class T>
Vector<T>::Vector(size_type sz, T x) :
    sz_(sz ? sz : 0),
    elem_(sz ? new T[sz] : nullptr) {
    for (size_type i{}; i != sz_; ++i)
        elem_[i] = x;
}

template<class T>
Vector<T>::~Vector() {
    delete[] elem_;
    sz_ = 0;
}


template<class T>
bool operator < (const Vector<T>& x, const Vector<T>& y) {
    return x.sz_ < y.sz_;
}


class A{
    public:

};



int main(){

    Vector<int> v1(7);
    Vector<int> v2(9);

    std::cout << (v1 < v2) << std::endl;

    Vector<A> v3(10);
    Vector<A> v4(12);

    std::cout << (v3 < v4) << std::endl;

}

但是,当我编译程序时,它运行良好,但是如果我定义<则无法正常工作,因此我收到链接时错误,抱怨以下内容的定义:

/usr/bin/ld: /home/5jxZPM/prog-a06418.o: in function主要': prog.cpp :(。text + 0x5e):对operator<(Vector<int> const&, Vector<int> const&)'

的未定义引用
  • 如果我在类中定义它,那么它将正常工作!

    template<class T>
    class Vector {
        public:
            friend bool operator < (const Vector<T>& x, const Vector<T>& y){
                return x.sz_ < y.sz_;
            }
        //...
    };
    

0 个答案:

没有答案