我目前正在通過加速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
可悲的是,該警告沒有多大意義的我,和讀取後我無法完全看到它將如何應用於我的代碼。
消息的其餘部分顯示爲編譯器無法識別返回類型。
我已經嘗試了許多不同的組合,搜索並沒有太大的幫助。我將不勝感激任何幫助。謝謝!
如果你仔細一看,第一個編譯器消息說「用'typename'前綴以指示類型」。現在你知道這意味着什麼! – 2011-03-24 17:42:05
這很有道理。我相信在「不是一種類型」之後的一段時間能夠幫助我解決這個問題。 – usm 2011-03-24 18:51:38