2012-08-10 61 views
0

我有一個問題陳述了新的遠程基於對聲明:C++ 11不等基於與指針

for (InputReaderObject irb : InputReader) 
{ 
...... 
} 

因此,大家可以看到,我有一個名爲InputReaderObject類,然後另一個變量被定義爲包含頭文件中的外部。並且在此之前被聲明爲InputReaderObject。現在,對於實際問題,我的intellisence和我的編譯器都在扼殺我

找不到類型爲'InputReaderObject *'的可調用'begin'函數。

現在我懷疑的是,在包含的頭文件中,它被聲明爲extern,並且作爲InputReaderObject(它被聲明爲數組)的數組並不真正可見。

那麼,基於範圍的語句使用指針嗎?或者這是我的問題?

謝謝

+2

顯示'InputReader'的聲明會有很大幫助。 – 2012-08-10 03:49:51

回答

5

如果InputReader在頭文件作爲常量大小的數組聲明,那麼它應該工作,只要你#include <array>#include <iterator>或任何其他幾個庫頭,使您獲得的聲明

template<typename T, std::size_t N> T* std::begin(T (&array)[N]); 
template<typename T, std::size_t N> T* std::end(T (&array)[N]); 

但如果InputReader聲明類似

extern InputReaderObject* InputReader; 

或者

extern InputReaderObject InputReader[]; 

...?這不是從明顯的有多少個對象數組中,但是讓我們假設相同的標題也有類似:

extern unsigned int InputReaderSize; 

任何你傳遞到範圍爲基礎的循環需要有beginend功能,這回迭代器。 (該功能可以爲類成員,通過參數相關的查找找到,或者在namespace std)的標準庫定義爲實際陣列和標準集裝箱一些beginend功能,但你可以通過定義自己的擴展它:

#include <iterator> 

struct InputReaderLoopType { 
    InputReaderObject* begin() const { return InputReader; } 
    InputReaderObject* end() const { return InputReader + InputReaderSize; } 
}; 
extern const InputReaderLoopType InputReaderLoop; 

會讓你做......

for (InputReaderObject& irb : InputReaderLoop) 

(製作irb的參考,而不是副本,只是一個建議,你可能真的需要複製的某些原因。)

如果您確實希望循環與InputReader一起工作,您也可以定義InputReaderObject* begin(InputReaderObject*);InputReaderObject* end(InputReaderObject*);。但是如果有人有一個不是InputReader的類型的指針,那可能會導致令人困惑的結果。

+1

對於數組在「範圍」語句中工作的情況,「begin' /'end'的重載不是必需的。 – 2012-08-10 03:46:48