我来自Java背景,是C ++的新手。 我有一个模板。
template <class T>
class Shape {
int val,val_new;
public:
Shape(T initval)
{
val=initval;
}
T get()
{
return val;
}
void set (T newval)
{
val_new = newval;
}
void copy()
{
this.val= val_new;
}
};
有一个使用此模板的类Rectangle
#include <iostream>
#include<math.h>
using namespace std;
class Rectangle
{
private:
Shape<TwoPoint> val;
TwoPoint newval;
public:
Rectangle(TwoPoint i)
{
val = new Shape<TwoPoint> (i);
}
Shape<TwoPoint> read()
{
return val;
}
void load(TwoPoint newval)
{
load_called=1;
this.newval=newval;
}
void increment()
{
val=val+1;
}
void decrement()
{
val= val-1;
}
void actions()
{
if (load_called)
value.set(new TwoPoint(newval));
}
};
TwoPoint是用于泛型的类。
class TwoPoint
{
int width;
int value;
public:
TwoPoint(int v, int w)
{
value=v;
width=w;
}
TwoPoint(TwoPoint t)
{
value= t.value;
width= t.width;
}
int getWidth()
{
return width;
}
int getValue()
{
return value;
}};
但是我遇到了很多错误,比如构造函数不匹配,转换失败。有人可以帮助我。
有错误,如
In constructor `Rectangle::Rectangle<TwoPoint>':
error: no matching function for call to Shape<TwoPoint>:: Shape()'
note: candidates are: Shape<T>::Shape<T> with [T = TwoPoint]
有两个类似的错误
答案 0 :(得分:4)
模板声明中存在问题:
template <class T>
class Shape {
int val,val_new;
public:
Shape(T initval)
{
val=initval;
}
//....
};
参数initval
的类型为T
,但您要将其分配给int
。也许您希望您的成员也是T
类型的成员?
template <class T>
class Shape {
T val,val_new;
public:
//....
};
答案 1 :(得分:2)
首先;在以下代码段中,this
使用“。”编号,但this
是指针,因此您应使用val = val_new;
(隐式this->val = val_new;
):
void copy() {
this.val = val_new;
}
......应该......
void copy() {
val = val_new;
// or this->val = val_new;
}
Rectangle::load
处的同样问题。
其次:与其他人一样,您应该使用T val, val_new
代替int val, val_new
。
最后但并非最不重要:
Rectangle(TwoPoint i) {
val = new Shape<TwoPoint> (i);
}
val
应该像这样投资:
Rectangle(TwoPoint i)
: val(Shape<TwoPoint> (i)) { }
这有两个原因:
val
未像这样初始化,则使用默认构造函数(Shape<T>::Shape()
),该构造函数不存在。new
关键字在C ++中分配新内存并返回指针。它应该被遗弃,因为val
不是指针而是值。在构造函数中,您可以通过调用其构造函数来初始化成员值,或者使用它们的值(自动生成的复制构造函数)调用它们。这应该以冒号an为前缀,后跟函数体。
答案 2 :(得分:1)
嗯,作为一个例子,在你的形状类的开头附近,我们看到了
int val,val_new;
Shape(T initval) {
val = initval;
此代码假定类型T
可分配给int
。由于TwoPoint
不是数字类型,也不包含int
的转换运算符,因此您无法实例化Shape<TwoPoint>
,因为模板无法编译。
答案 3 :(得分:1)
由于您没有使用构造函数初始化,因此导致出现有关Shape()构造函数的错误。在Rectangle中,val会在您进行分配之前获取默认构造。而且你没有定义一个Shape()构造函数。
尝试:
Rectangle(TwoPoint i) :
val(i)
{
}