首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

[]C++关于"模板类 运算符重载 类的前置声明"的一个混合有关问题

2012-03-26 
[求助]C++关于模板类 运算符重载 类的前置声明的一个混合问题想实现一个3维点的类Point3D T 和3维向量

[求助]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; }; 

热点排行