2014-09-27 71 views
-1

給定一個模板類:如何在C++中使用模板中定義的類型?

template<class T, class U> 
    struct myList { 
    typedef T head; 
    typedef U next; 
    }; 

class nullList {}; 

這有可能使類的列表,例如

myList<int, myList<string, myList<short, nullList> > >; 

我想使用上面的列表來創建一個模板類,它只處理列表中的類。在上面的例子中,我的課程將處理整數,字符串和短褲(例如,將它們打印到控制檯)。

我一直在爲此苦苦掙扎,而且我還不確定從哪裏開始。與

template<class T, class U> 
class myClass { 
    ... 
}; 

開頭的代碼失敗,因爲MyClass的只需要一個模板參數,那就是myList中即

myClass<myList> 

但是,如果我嘗試使用

template<typename l> 
class myClass { 
    l.head foo;// cannot refer to type member 'head' in 'myList<int, nullList>' with '.' 
} 

技術上myList.head應該是一個班級吧?我怎樣才能使用這些信息?

+1

將您的模板重命名爲例如'mylist'以避免與'std :: list'發生衝突和混淆。請閱讀一本好的[C++編程](http://www.stroustrup.com/programming.html)書。 – 2014-09-27 06:10:10

+0

你應該解釋爲什麼你認爲列表模板應該有兩個模板參數。我猜想它應該只有一個(列表元素內的數據類型)。或者你的名字'myList'令人困惑:你*不*處理任何列表。 – 2014-09-27 06:54:12

+0

@BasileStarynkevitch因爲它是一個類型列表,而不是一個值列表。這種列表模板在模板元編程中很常見,我想這是目前正在教授的OP。 – sepp2k 2014-09-27 06:56:01

回答

2

.運營商訪問對象的成員。 l不是一個對象 - 它是一個類。要訪問類的靜態成員,請使用::運算符。當你正在訪問的成員是一個類型,並且你訪問它的類是一個模板參數時,出於語法原因,你還需要關鍵字typename。所以,你就變成了:

template<typename l> 
class myClass { 
    typename l::head foo; 
} 

如果你想要的是打印出給定類型的值,你是不是有意與該類型的成員創建對象,你可以只定義一個靜態函數,它的類型它的參數:

template<typename l> 
class myClass { 
    public: 
    static void print(typename l::head foo) { 
     std::cout << foo << std::endl; 
    } 
}; 

其實在這種情況下,如果只考慮名單的頭,你不都需要一類,可能只是做:

template<typename l> 
void print(typename l::head foo) { 
    std::cout << foo << std::endl; 
} 

但是你」 (probab當你開始考慮列表尾部時,你需要這門課。

+0

第二次出現的'typename'是不是'typedef'? – 2014-09-27 06:42:51

+0

@BasileStarynkevitch號我們聲明瞭一個變量,而不是typedef。變量的類型是'l :: head',它的名字是'foo'。 – sepp2k 2014-09-27 06:43:52

+0

但是爲什麼不直接使用'l :: head foo;'? – 2014-09-27 06:44:56

相關問題