提前感谢您的关注!
我编写了一个简单的线性代数库,其中包括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