在C ++中使用模板的问题

时间:2012-02-17 14:43:20

标签: c++ oop

我来自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]

有两个类似的错误

4 个答案:

答案 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)) { }

这有两个原因:

  1. 如果val未像这样初始化,则使用默认构造函数(Shape<T>::Shape()),该构造函数不存在。
  2. new关键字在C ++中分配新内存并返回指针。它应该被遗弃,因为val不是指针而是值。
  3. 在构造函数中,您可以通过调用其构造函数来初始化成员值,或者使用它们的值(自动生成的复制构造函数)调用它们。这应该以冒号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)
{
}