2014年3月21日 星期五

[C++] 如何在template 善用typename ?

在編譯其他人的Program 時發現的。(也多虧這些人有釋出這種奇奇怪怪的code,
我才發現g++ 編譯器在處理template時是怎麼運作的。)
example:
template<typename T>
class A{
public:
    T m_A;
    void funcTest()
    {
        map<T , int> mapTempTable; /* 這部分沒問題, OK! */
        map<T, int>::iterator it;  /* 編譯器會出錯! */
    }
};
第8行如果這樣子寫的話,g++ 編譯器會出錯!硬是要在前面加個typename 變成:
typename map<T, int>::iterator it;
才能夠解決!
這是為什麼呢? 因為:: scope operator 接在它後面的可以是成員變數、函數或是
物件類型。
如果不加上typename的話,編譯器可能會將iterator 誤認為成員變數。
(實際上iterator是一個物件類型)
所以要加上typename,讓編譯器知道這個東西是一個物件類型。
Ref:

沒有留言:

張貼留言