所以我有一些基本的课程 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;
}
答案 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
(即箭头运算符)访问其成员,而是使用->
(即点运算符)。
.
如果您希望仅当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
答案 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);
}