2012-04-22 44 views
1

我正在嘗試創建一個簡單的基類和從其繼承的另一個類。我收到以下錯誤。錯誤:在帶有模板的'{'令牌之前預期的類名稱

guard_room.h:17:1: error: expected class-name before ‘{’ token

我已經看過其他職位,好像我有一個循環依賴的地方,但我所做的一切,我已閱讀來解決它。下面是我的課

基類room.h:

#ifndef _room 
#define _room 

template <typename U, typename T> 
class room 
{ 
    public: 

     //default constructor 
     room(); 

     //overloaded constructor 
     room(U, T); 


     //getters/setters 
     void set_treasure(T); 
     void set_name(U); 
     T get_treasure() const; 
     U get_name() const; 

    private: 

     U name; 

     //room monster 
     //monster room_monster 

     T treasure; 

}; 

#include "room.tem" 

#endif 

繼承類guard_room.h:

#ifndef _guard_room 
#define _guard_room 

template <typename U, typename T> class room; 

template <typename U, typename T> 
class guard_room : public room 
{ 
    public: 

     //default constructor 
     guard_room(); 

     //overloaded constructor 
     guard_room(U, T, T) : room(U, T); 

     //battle function? 
     void battle(); 

    private: 
     T dummy; 

}; 

#include "guard_room.tem" 
#endif 

我也是在我需要把徹底糊塗包括我的繼承類中的基本類。感謝您的幫助。

回答

2

首先,你的派生類需要能夠看到你的基類的整個定義 - 你需要包括派生類的文件頂部的標題。 (一個基類擴展派生類,所以基類派生類的非常多的一部分)

此外,房間是一個模板,而不是一類 - 你只能從一個具體的類繼承,所以你需要指定模板參數。即

#include "room.h" 

template <typename U, typename T> 
class guard_room : public room<U, T> 

最後 - 你的.tem文件還包含標題守衛?(如果沒有,你需要那些有太多,以避免其它編譯器錯誤)


此外,要知道,一個初始化器列表構造函數定義的一部分,所以下面是無效的

guard_room(U, T, T) : room(U, T); 

如果你的構造函數的定義是在其他地方,那麼所有你想在這裏是

guard_room(U, T, T); 

否則,它可能只是足夠寫

guard_room(U u, T t1, T t2) : room(u, t1) {} 
+0

感謝您的幫助。模板繼承的特定語法是我以前沒有處理過的。 – 2012-04-22 07:27:34

+0

我已經編輯了帖子 - 在線程中的其他答案(賈斯汀和本),以指出初始化列表中的錯誤。 – 2012-04-22 07:42:54

3

您提供如果你想要的實施內聯的構造函數的實現在這裏

//overloaded constructor 
guard_room(U, T, T) : room(U, T); 

一半,你必須添加構造函數體也是如此。

//overloaded constructor 
guard_room(U, T, T) : room<U, T>() 
{ } 

當構造函數的實現也包括在.tem文件在表頭(如在註釋指示)的端部,真正的解決辦法是隻刪除提及的基類從構造函數聲明中,並將其留給單獨的定義。

//overloaded constructor 
guard_room(U, T, T); 
+0

啊我看到你說,但我'guard_room.tem'我有下面的構造'模板 guard_room :: guard_room(U NEW_NAME,T量,T new_dum):房間(new_name,金額) { this-> dummy = new_dum; }' – 2012-04-22 07:11:22

+1

好的,那麼你應該從頭部刪除':room(U,T)'。無論哪種方式將工作。 – 2012-04-22 07:13:12

+0

賈斯汀現在刪除的答案提出了一個重要的觀點:* ctor-initializer-list *需要實際的參數,而不是類型。 – 2012-04-22 07:18:37

相關問題