Проблемы с использованием шаблонов в C ++ - PullRequest
0 голосов
/ 17 февраля 2012

Я из Java Backgroung и новичок в 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 ]

4 голосов
/ 17 февраля 2012

В объявлении шаблона есть проблема:

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:
   //....
};
2 голосов
/ 17 февраля 2012

Во-первых; в следующем фрагменте кода 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 - не указатель, а значение.

В конструкторах вы можете инициализировать значения элементов, вызывая их конструкторы или вызывая их с их значением (конструктор автоматически генерируемых копий). К этому следует добавить префикс двоеточия, за которым следует тело функции.

1 голос
/ 17 февраля 2012

Ваша ошибка в конструкторе Shape () вызвана тем, что вы не использовали инициализацию конструктора. В Rectangle val создается по умолчанию до того, как вы его назначите. И вы не определили конструктор Shape ().

Попытка:

Rectangle(TwoPoint i) :
    val(i)
{
}
1 голос
/ 17 февраля 2012

Ну, в качестве примера, в начале вашего класса фигуры мы видим

int val,val_new;
Shape(T initval) {
    val = initval;

В этом коде предполагается, что тип T может быть присвоен int. Поскольку TwoPoint не является числовым типом и не содержит оператора преобразования в int, вы не можете создать экземпляр Shape<TwoPoint>, так как шаблон не будет компилироваться.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...