读书人

[]C++关于quot;模板类 运算符重载 类的前置

发布时间: 2012-03-26 15:46:55 作者: rapoo

[求助]C++关于"模板类 运算符重载 类的前置声明"的一个混合问题
想实现一个3维点的类Point3D <T> 和3维向量的类Vector3D <T> , 在Point3D <T> 类中重载-实现两个两个点相减返回一个向量, 下面是我的代码:
-------------------------------------------------------
template <class T>
class Vector3D <T> ;

template <class T>
class Point3D
{
friend Vecotr3D <T> operator-(const Point3D <T> & p1, const Point3D <T> & p2)
{
Vector3D <T> v;

v.x = p1.x - p2.x;
v.y = p1.y - p2.y;
v.z = p1.z - p2.z;

return v;
}

...
...

public:
Tx;
Ty;
Tz;
};

template <class T>
class Vector3D
{
...
...
public:
Tx;
Ty;
Tz;
};
-------------------------------------------------------

出了很多错误。

如果函数operator-返回Point3D的话,就没有错误。

[解决办法]
class Vector3D <T >;改成class Vector3D;vc6里编译通过
[解决办法]
呵呵

我那个Vector3D要用到Point3D呀(一个构造函数), 所以还不能放在后面。

愁啊!

将代码的行号写出来:
---------------------------------
19: template <class T >
19: class Vector3D <T >;
20:
21: template <class T >
22: class Point3D
23: {
24: friend Vecotr3D <T > operator-(const Point3D <T >& p1, const Point3D <T >& p2)
25: {
26: Vector3D <T > v;
27:
28: v.x = p1.x - p2.x;
29: v.y = p1.y - p2.y;
30: v.z = p1.z - p2.z;
31:
32: return v;
33: }
============================
24: operator - 也用到了vector3D<T>的构造函数阿,所以这个设计本身具有循环依赖,forward declaration不可以用,事实上各个编译器对template的支持不尽相同,有的好像可以通过export关键字解决,但是可移植性很差。

我回这个帖子的意思是:C++重在设计
[解决办法]

C/C++ code
template<class T>class point3D{private:    T x,y,z;public:    point3D():x(),y(),z(){}    point3D(const T&x_,const T&y_,const T&z_):x(x_),y(y_),z(z_){}    point3D(const point3D<T>& copy)    {        x=copy.x;        y=copy.y;        z=copy.z;    }    const T getx() {return x;}     const T gety() {return y;}    const T getz() {return z;}    const point3D<T> operator =(const point3D<T> &copy)    {        x=copy.x;        y=copy.y;        z=copy.z;        return *this;    }    void setx(const T& x_)    {x=x_;}    void sety(const T& y_)    {y=y_;}    void setz(const T& z_)    {z=z_;}    template<class U> friend class point3D;    template<class U> point3D<T> operator -(point3D<U>& sr)        {            point3D<T> value;            value.setx(x-T(sr.getx()));            value.sety(y-T(sr.gety()));            value.setz(y-T(sr.getz()));            return value;        }    point3D<T> operator -(point3D<T>& sr)    {        point3D<T> value;        value.setx(x-sr.getx());        value.sety(y-sr.gety());        value.setz(y-sr.getz());        return value;    }};
[解决办法]
C/C++ code
template   <class   T > class   Vector3D; template <class T> class   Point3D {     friend  Vector3D<T> operator- (const   Point3D <T>& p1, const   Point3D <T>& p2)     {         Vector3D<T> v;         v.x   =   p1.x   -   p2.x;         v.y   =   p1.y   -   p2.y;         v.z   =   p1.z   -   p2.z;         return   v;     } public:     T x;     T y;     T z; }; template  <class   T > class   Vector3D { public:     T x;     T y;     T z; }; 

读书人网 >C++

热点推荐