2012-02-21 72 views
0

我寫HAE下面的代碼:錯誤在C++模板片段

class Object 
{ 
    public: 
    Object() 
    {} 
}; 

template <class T> 
class Reg : public Object 
{ 
    T val,val_new; 
    public: 
    Reg(T initval) 
    { 
    super(); 
    val=initval; 
    } 
}; 

在代碼中的錯誤是

t.cpp: In constructor 'Reg<T>::Reg(T)': 
Line 15: error: there are no arguments to 'super' that depend on a template parameter, 
so a declaration of 'super' must be available 
compilation terminated due to -Wfatal-errors. 

我怎樣才能消除這個錯誤嗎?

+3

什麼是「超級」?它在哪裏定義? (你通常用Java代碼嗎?) – Mat 2012-02-21 06:50:49

+0

C++中沒有超類,因爲它允許多重繼承 – Anycorn 2012-02-21 06:53:37

+0

VC++有'__super'關鍵字來訪問基類(如果沒有歧義的話)。其他編譯器也可能有類似的關鍵字。是的,那不是標準。 – Ajay 2012-02-21 08:31:08

回答

5
class Object 
{ 
public: 
    Object() {} 
}; 

template <class T> 
class Reg : public Object 
{ 
    T val,val_new; 
public: 
    Reg(T const& initval) 
     : val(initval) 
    {} 
}; 

有一個在標準C沒有super ++。一些編譯器提供它作爲語言擴展,但在標準C++中,如果你想要「 」基類的通用名稱,那麼你必須typedef它。例如,在類Reg中,您可以typedef Object Base;

建設: val(initval)構造函數初始化列表,在本質上調用成員和基類構造函數的,避免默認施工。

最後,const&通過參考,避免了費時和存儲器消耗的實際參數的複製;這是C++中另一件不同的事情(與Java相比,我假設你’來自於此)。

2
class Object 
{ 
    public: 
    Object() 
    {} 
}; 

template <class T> 
class Reg : public Object 
{ 
    T val,val_new; 
    public: 
    Reg(T initval) : Object() // initializer list 
    { 
    val=initval; 
    } 
}; 
+0

也可以在初始化列表中初始化'val'。 – Mat 2012-02-21 06:57:08