2012-02-17 63 views
-1

我來自Java背景,是C++的新手。 我有一個模板。在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; 
} 
}; 

有一類長方形,使用此模板

#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)); 
} 
}; 

的兩點是用於泛型類。

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

如果您向我們提供您送入一個編譯器的單一翻譯單元,而且它產生的錯誤信息(S)這將是更爲有用。 – PlasmaHH 2012-02-17 14:46:31

+0

對不起。下次我發佈一個問題肯定會做。 – 2012-02-17 14:47:59

+0

你可以編輯問題。 – PlasmaHH 2012-02-17 14:48:43

回答

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應initalized這樣的:

Rectangle(TwoPoint i) 
    : val(Shape<TwoPoint> (i)) { } 

有兩個原因:

  1. 如果val不像這樣初始化,默認構造函數(Shape<T>::Shape()),它不存在。
  2. new關鍵字在C++中分配新內存並返回一個指針。由於val不是一個指針,而是一個值,所以它應該保留。

在構造函數中,您可以通過調用其構造函數來初始化成員值,或使用它們的值(自動生成的複製構造函數)調用它們。這應該以一個冒號和一個函數體爲前綴。

+0

'void Rectangle :: load(TwoPoint)' 上下文信息不足以確定類型 – 2012-02-17 15:49:12

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

嘛,只是作爲一個例子,你的形狀類的開頭附近,我們看到

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

此代碼假定類型T是分配給int。由於TwoPoint不是數字類型,也不包含轉換運算符到int,因此無法實例化Shape<TwoPoint>,因爲模板無法編譯。

1

有關Shape()構造函數的錯誤是由於您沒有使用構造函數初始化而導致的。在Rectangle中,val會在您分配給它之前得到默認構造。而你沒有定義一個Shape()構造函數。

嘗試:

Rectangle(TwoPoint i) : 
    val(i) 
{ 
}