具有模板

时间:2015-11-26 16:49:30

标签: c++ templates

所以我有一些基本的课程 A ,如下所示:

template<class T1>
class A {
public:
    X* x;

    template <class T2>
    A(const A<T2> &a) {
        x = new X(a->x);
    }
};

T1和T2都是从X继承的类型。但是,这段代码不起作用,我真的无法理解如何编写它以便构造函数能够采用另一个 A 具有可能不同的模板参数。

所以为了说清楚我想编写一个构造函数,可以使用不同的模板参数获取 A 。 (代码按原样编译,模板部分似乎没有按照我想要的方式工作)。

我希望能做什么:( Y Z 继承 X

A<Z> a1;
A<Y> a2(a1);

非常感谢任何帮助!

抱歉,我以为我能够创建一个好的示例而不必使用我的实际代码,但似乎我的语法失败了,所以这是我的真正的类切一点点:

template <class T>
class Calendar {
private:
    Date *d;
public:
    template <class T2>
    Calendar(const Calendar<T2> &c) {
        d = new T(c.view_date_component());
    }
    Calendar();
    ~Calendar();
    const Date& view_date_component() const;
};

template <class T>
Calendar<T>::Calendar() {
    d = new T();
}

template <class T>
Calendar<T>::~Calendar() {
    delete d;
}

template <class T>
const Date& Calendar<T>::view_date_component() const {
    return *d;
}

2 个答案:

答案 0 :(得分:1)

首先,您还需要定义默认构造函数。其次,您必须使模板类成为自己的朋友才能访问私有成员变量x。第三,在模板构造函数中,您将 NewJFrame.PInf = MouseInfo.getPointerInfo(); /* The frame is contained in NewJFrame, PInf is a PointerInfo */ p = (NewJFrame.PInf.getLocation()); // p is a point p.x-=NewJFrame.getWindows()[0].getLocationOnScreen().x; p.y-=NewJFrame.getWindows()[0].getLocationOnScreen().y; //i subtract the location of the window relative to the screen img = NewJFrame.lblRover.getLocation(); img.x+=NewJFrame.lblRover.getWidth()/2; img.y+=NewJFrame.lblRover.getHeight()/2; // img will be the point with the center of my image sas=getAngle(p,img); // sas is a float variable NewJFrame.degrees=sas; // // From now on i move the image // diffx = p.x-img.x; diffy = p.y-img.y; diffx/=80; // 80 is an arbitrary number to smooth the effect diffy/=80; // high numbers will make the image not move at all Point var = new Point(NewJFrame.lblRover.getLocation()); // I may have to use img here or subtract width and height /2 var.x+=diffx; var.y+=diffy; NewJFrame.lblRover.setLocation(var); // A 5ms sleep to smooth the movement // I also refresh a debug label // Also i do refresh the frame, otherwise nothing happens NewJFrame.jLabel1.setText(""+NewJFrame.lblRover.getLocation().y +"/"+ p.y+" "+NewJFrame.lblRover.getLocation().x +"/"+ p.x ); NewJFrame.getFrames()[0].repaint(); try { sleep(5); } catch (InterruptedException ex) { Logger.getLogger(thread.class.getName()).log(Level.SEVERE, null, ex); } 作为a引用传递。因此,您无法使用const(即箭头运算符)访问其成员,而是使用->(即点运算符)。

.

Live Demo

如果您希望仅当template<class T1> class A { X* x; public: A() = default; ^^^^^^^^^^^^^^ template <class T2> A(const A<T2> &a) { x = new X(*(a.x)); ^^^^^^ } template<class T2> friend class A; ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ }; T1继承自T2时才会引发模板构造函数:

X

Live Demo

答案 1 :(得分:0)

如果要检查T2扩展X或执行T1,可以将SFINAE与std::is_base_of一起使用:

template <class T2, typename = std::enable_if_t<std::is_base_of<X, T2>>>
A(const A<T2> &a) {
    x = new X(a->x);
}