2011年8月30日 星期二

[C++] Effective C++ Item 42: Understand the two meanings of typename

今天剛好遇到一個小問題, 之前剛好在翻Effective C++, 翻一下書剛好就找到了, 順便在加深一下印象~

typename除了直接使用在template裡面當然宣告template parameter的地方, 如以下情形之外

template
class Foo
{
public:
    void foo(T a);
};

當在程式內部的name跟template parameter有相依關係的時候, 這個就叫做dependent name, 在C++當中, 他預設不會幫你假設這樣的name是type, 除非你有明確的告訴parser.

所以像以下的情形, 你就必須在前面加上typename, 這樣compiler才會認為宣告的T::iterator 也是一個type, 才不會有compiler error.


template
class Foo
{
public:
    void foo(T a);
    void goo(typename T::iterator i);
private:
    typename std::vector::iterator a;
};