2011-03-24 80 views
1

我目前正在通過加速C++工作,並且我被困在練習11-6中。這個想法是將標準庫向量重新實現爲一個名爲Vec的類。返回在該類中定義的類型的類模板的成員函數的正確語法是什麼?

我對iterator erase(iterator)成員有問題,因爲我不知道類定義之外的正確語法,並且我嘗試過的所有內容都會導致編譯器錯誤。我現在的代碼是:

template <class T> T* Vec<T>::erase(T* pos){ 

    if(pos < avail) 
     std::copy(pos + 1, avail, pos); 

    --avail; 
    alloc.destroy(avail); 

    return pos; 

} 

這很好用。然而,爲了維護的目的,並與STL算法的兼容性,我知道我應該做這樣的事情:

template <class T> Vec<T>::iterator Vec<T>::erase(Vec<T>::iterator pos){ 

    // As before 

} 

我已經在類定義中定義iterator,如下:

typedef T* iterator; 

試圖與在第二代碼片段的結果進行編譯:

D:\Documents\Programming\Accelerated C++\Chapter 11>cl /EHsc Vec.cpp 
Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 15.00.21022.08 for 80x86 
Copyright (C) Microsoft Corporation. All rights reserved. 

Vec.cpp 
Vec.cpp(23) : warning C4346: 'Vec<T>::iterator' : dependent name is not a type prefix with 'typename' to indicate a type 
Vec.cpp(23) : error C2143: syntax error : missing ';' before 'Vec<T>::erase' 
Vec.cpp(23) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int 
Vec.cpp(23) : fatal error C1903: unable to recover from previous error(s); stopping compilation 

可悲的是,該警告沒有多大意義的我,和讀取後我無法完全看到它將如何應用於我的代碼。

消息的其餘部分顯示爲編譯器無法識別返回類型。

我已經嘗試了許多不同的組合,搜索並沒有太大的幫助。我將不勝感激任何幫助。謝謝!

+1

如果你仔細一看,第一個編譯器消息說「用'typename'前綴以指示類型」。現在你知道這意味着什麼! – 2011-03-24 17:42:05

+0

這很有道理。我相信在「不是一種類型」之後的一段時間能夠幫助我解決這個問題。 – usm 2011-03-24 18:51:38

回答

7
template <class T> 
    typename Vec<T>::iterator Vec<T>::erase(typename Vec<T>::iterator pos){ 
//^^^^^^^^ note this      ^^^^^^^^ note this as well! 

     //your code! 
    } 

typename是需要在兩個地方。這是因爲iterator是從屬名稱,所以需要typename

讀通過所謂Johannes一個偉大的傢伙,#2本身這個優秀的解釋:


鏈接到其他的好文章:

+1

謝謝,完美的工作。我現在會做一些閱讀,所以我可以理解*爲什麼*好一點。 – usm 2011-03-24 17:26:36

+1

@usm:我發佈了一些鏈接。閱讀Johannes的解釋。他的解釋非常好,比你在網上找到的要好得多! – Nawaz 2011-03-24 17:49:44

3
template <class T> typename Vec<T>::iterator Vec<T>::erase(typename Vec<T>::iterator pos){ 

    // As before 

} 

...因爲這裏的迭代器的名稱是依賴模板參數」無typename編譯假裝認爲VEC :: iterator是VEC的靜態成員:)

+2

'tyepname'在參數中也是必需的! – Nawaz 2011-03-24 17:03:18

相關問題