如何在单独的文件中实现模板类中的友元函数?

时间:2018-04-03 04:35:59

标签: c++ templates compilation friend-function

提前感谢您的关注!

我编写了一个简单的线性代数库,其中包括vetcor,point和matrix类的实现。我添加了友元函数的原型,例如<< ,*,+, - 在名为linearalgebra.h的单独头文件中的操作。此文件包含在所有类头文件中,仅向前声明了类并在源文件中提供了友元函数的实现,以避免在我的库命名空间中添加几个std包含。预计,单独使用linearalgebra.h文件会引发“不完整类”异常。但是,当我将类更改为基于模板类型时,友元函数只能在linearalgebra.h中实现,其中没有类的实现。我很困惑,如果没有访问类实现,这适用于模板类,而没有模板时它不起作用? g ++编译器如何处理我的代码?

以下是一些代码段

linearalgebra.h文件

namespace Linearalgebra{
    template<typename T> class Matrix;
    template<typename T> class Point;
    template<typename T>
    Point<T> operator*(const Matrix<T> &t, const Point<T> &p) {
        //implementation for operator* which has access to private members 
        //of matrix and point class
        return point;
    }
}//end of namespace

point.h文件

#include "linearalgebra.h"
namespace Linearalgebra{
    template<typename T>
    class Point{
        // class implementation ……………….
        //friend function declaration
        template<typename  U>
        Point<U> operator*(const Matrix<U>& t, const Point<U>& p);
    };
}//end of namespace

matrix.h文件

#include "linearalgebra.h"
namespace Linearalgebra{
    template<typename T>
    class Matrix{
        // class implementation ……………….
        //friend function declaration
        template<typename  U>
        Point<U> operator*(const Matrix<U>& t, const Point<U>& p);
    };
}//end of namespace

0 个答案:

没有答案