2012-03-19 99 views
0

我想這樣做:模板參數化的枚舉

template <enum Type> 
class Message { 
private: 
    Type m_type 
}; 

enum StdInMessages { PrintHello, Echo, ... }; 
class StdInMsg : Message<StdInMessages> 
{ ... } 

enum NetworkMessages { DoSomethingElse, Shutdown ... }; 
class NetworkMsg : Message<NetworkMessages> 
{ ... } 

當然,實際的消息略有不同

爲什麼不這項工作?

template <enum T> class ATemplate {}; 

我得到這個錯誤

error: use of enum ‘T’ without previous declaration 
+0

那麼,之前聲明的枚舉'T'是什麼? – 2012-03-19 10:07:37

+0

你是說'class NetworkMsg:Message '? – CapelliC 2012-03-19 10:50:15

回答

1

因爲這不是一個模板有效的語法,除非你要找的是什麼就是什麼康拉德回答。您可以使用typenameclass

下應該這樣做:

enum X 
{ 
    a 
}; 

template <typename T> class ATemplate {}; 

ATemplate<X> A; 
+0

好吧,我以爲我看到其他類型被用作參數的例子,但現在我意識到那些是非常不同的(非類型參數) – nishantjr 2012-03-19 10:15:21

+0

不是。 'template '如果在定義模板時有一個名爲'E'的枚舉,那麼它是完全有效的。但是,它不是非常有用,因爲它會導致一個未命名的模板參數。 – 2012-03-19 10:16:18

+0

是的,但在這種情況下,它會使用枚舉值來實例化,而不是枚舉(我認爲)。 'Atemplate是否 sunday_obj;' VS 'Atemplate是否<類daysOfTheWeek> days_obj;' – nishantjr 2012-03-19 10:20:11

2

它的工作原理,如果enum T事先聲明:

enum T { 
    foo, bar 
}; 

template <enum T> // or simply `template <T>` 
class ATemplate { }; 

int main() { 
    ATemplate<foo> x; 
} 

但是從變量名T來看,這是不是你想要的。由於很難猜出你想要什麼,你需要更具體。

+0

更新的問題 – nishantjr 2012-03-19 10:34:14