2012-12-10 43 views
4

我想實現一個簡單的本地C++固定容量數組模板類,爲了方便起見,支持基於範圍的「for each」語法。在定製常量本機C++容器類上支持「for each」

我在支持常量實例時遇到問題。

使用這種實現:

template< class T, size_t Capacity > 
class List 
{ 
public: 
    List() { mSize = 0; } 

    const T* begin() const { return mItems; } 
    const T* end() const { return mItems + mSize; } 

    T* begin() { return mItems; } 
    T* end() { return mItems + mSize; } 

private: 
    size_t mSize; 
    T mItems[ Capacity ]; 
}; 

這種用法:

const List< int, 5 > myInts; 
for each(const int myInt in myInts) 
{ 
    continue; 
} 

我得到這個錯誤:

error C2440: 'initializing' : cannot convert from 'const int *' to 'int *' 
    Conversion loses qualifiers 

這種用法不抱怨:

List< int, 5 > myInts; 
for each(const int myInt in myInts) 
{ 
    continue; 
} 

這(不良)實現不抱怨:

template< class T, size_t Capacity > 
class List 
{ 
public: 
    List() { mSize = 0; } 

    T* begin() const { return const_cast< List* >(this)->mItems; } 
    T* end() const { return const_cast< List* >(this)->mItems + mSize; } 

private: 
    size_t mSize; 
    T mItems[ Capacity ]; 
}; 

那是什麼,我不理解引擎蓋下回事?這是什麼關於std :: vector <>能夠正確處理這個問題?謝謝!

回答

2

您的用例對我來說似乎有點奇怪,因爲您已經寫下了C++中的每個構造。在C++ 11中引入了常規for和基於範圍的for。我只能猜測你的真實用例是什麼,但很可能是由於const正確性錯誤導致的編譯器投訴。如果沒有你正在嘗試運行的真實代碼,我無法真正地確定你的錯誤。無論如何,以下是展示兩種用法的實例。希望它有幫助,但如果您有任何問題 - 請隨時跟進,我會盡力解釋。

#include <cstdlib> 
#include <iostream> 

template <typename T, std::size_t Capacity> 
class List { 
    public: 
    List() : mSize(0) {} 

    const T *begin() const { return mItems; } 
    const T *end() const { return mItems + mSize; } 

    T *begin() { return mItems; } 
    T *end() { return mItems + mSize; } 

    void add(int v) 
    { 
     // TODO: Check for out of range here... 
     mItems[mSize++] = v; 
    } 

    private: 
    size_t mSize; 
    T  mItems[Capacity]; 
}; 

int main() 
{ 
    /* const */ List<int, 10> array; 

    array.add(1); 
    array.add(11); 
    array.add(15); 
    array.add(3); 

    // C++11 style (range-based for) 
    for (int p : array) { 
     std::cout << p << '\n'; 
    } 

    // Pre C++11 style 
    for (const int *from = array.begin(), *to = array.end(); from != to; ++from) 
    { 
     int p = *from; 
     std::cout << p << '\n'; 
    } 
} 
+0

感謝您的時間Vlad。我沒有提到「爲每個」似乎是最近微軟編譯器特有的語法糖(我不關心可移植性)。如果VS2010支持你描述的C++ 11語法,我很樂意使用它 - 現在我不在開發機器上,但是我認爲(const int p:array)也可以工作?儘管如此,我很好奇爲什麼「對於每一個人」都不適合我,而且似乎也找不到任何可能爲我們提供一些亮點的好文檔。 – beau

+0

@beau哦,我已經使用了它,看起來像VS 2005中引入的非標準微軟特定構造。由於我沒有使用多年的MS編譯器,所以我不能多說,但是VS 2010肯定支持標準基於C++ 11範圍,你可能不得不在項目設置中選擇它。對不起,我在這裏沒用,我試過了;) – 2012-12-10 05:43:26

+0

+1在for'initial'初始化器中抓取array.end()。 –