在《effective c++ 3.0》的第41條款提到:
在使用從屬巢狀型別名稱是需要使用typename來修飾,因為類屬模板的實現是「編譯時」的,若下狀況
void print(const t& con)
{if(con.size() >= 2)
{t::const_iterator iter(con.begin());
++iter;
int value = *iter;
std::cout《編譯器無法知道t::const_iterator到底是t裡的成員呢,還是像我們一樣,能把他當做一種型別來看待,因此編譯器就無法匹配出對應的**,從而編譯錯誤
不過我分別使用了g++和vc編譯,發現vc是可以通過的!!
而g++過不了,報錯的內容也是:t::const_iterator需要加個";"
從而我們可以看出編譯器確實把t::const_iterator當做乙個成員了
還有vector> vec;在g++也是編譯不過的,因為編譯器突然看到">>"這個右移運算子,覺得莫名奇妙
不過vc還是編譯過了,說明vc編譯器確實一分錢一分貨啊~~~體積龐大,也有它設計的獨到之處。
不過這個就難為程式設計師了,當移植**時,g++是讀不出的,所以建議vc程式設計師還是符合標準吧,在t::const_iterator前新增typename給編譯器標示一下,後加個空格
關於GetProcAddress和名稱修飾
dllexport屬性告訴鏈結器 請將指定的函式標記為匯出並為它生成乙個匯出項。這個匯出項是經過修飾的,對於匯出多個過載的函式來說,匯出修飾後的名稱是十分必要的。但是,這也意味著 你傳入到getprocaddress函式中的函式字串也需要是修飾版本的。從我們之前的幾篇關於呼叫約定的文章中,我們知道,...
C 模板 名稱查詢
在編譯模板的時候,編譯器會分兩個階段去解析遇到的名稱,第乙個階段解析不依賴於模板引數的名稱,第二個階段解析依賴於模板引數的名稱,下面舉個簡單的例子來說明這一點 templateclass x typedef double e templateclass y public x 這個例子中定義了兩個類模...
C 的名稱查詢順序
大致順序是 編譯器執行以上步驟的時候是使用貪心匹配,只要找到乙個符合當前檢查內容的就會停止查 找所以任何一層都有可能發生錯誤的掩蓋情況 例1void f int class y y 這裡的f 2 在1.2 這裡找到了符號f,就不會向上到1.5 查詢到真正的f int 了 例2void g int n...