2014-01-30 46 views
3

我試圖實現類似於std :: string的行爲的類,並且在std :: copy行中出現錯誤:「沒有類型命名'const_reference'」實現類似字符串的類時出錯

Str& operator+=(const Str& s){ 
    std::copy(s.data.begin(), s.data.end(), std::back_inserter(data)); 
    return *this; 
} 

「數據」的類型是VEC <字符>的對象,VEC是一種媒介像類,我實現了自己和它似乎是工作在自己的罰款。

也這樣說:

C:\ MinGW的\ BIN .. \ LIB \ GCC \的mingw32 \ 3.4.2 ........ \包含\ C++ \ 3.4.2 \位\ stl_iterator.h ||實例化std :: back_insert_iterator < vec < char>>':|

+0

那麼你的'vec '有'const_reference'類型嗎? – Simple

+0

我添加了一個'typedef const T&const_reference'並編譯完成,現在讓我們來看看它是否可行。謝謝大家的答案,希望我可以讓所有人都滿意。 – Koz

+0

你應該接受其中一個答案,如果他們幫助點擊勾號。 – Simple

回答

4

聽起來好像您的vec不符合容器要求,因此不能保證可以使用與容器一起使用的標準工具(如back_inserter)。

雖然C++ 98中的表65可能更適合古代編譯器,但在C++ 11中的表96中指定了這些要求。其中一個要求是嵌套的const_reference類型。

3

檢查要求std::back_inserterstd::copy。特別地,std::back_inserter期望滿足概念容器的論據。至少這意味着執行該標準的§23.2.1,並且列出的要求之一是:

X::const_reference | const的左值爲T |編譯時間

也就是說,一個typedef const_reference裏面的容器類型。

2

back_inserter是一個便利的功能,它構造了容器上的back_insert_iterator;在這種情況下,data

data,你說過,是你自己的本土vector類型的類。爲了達到此目的,您的vector類必須具有已定義的const_reference typedef。事情是這樣的:

template <typename Item> 
class Vec 
{ 
public: 
    typedef const Item& const_reference; 
}; 

有許多用於容器的任何實現其他要求。這些在C++ 03標準中概述,在部分23.1容器要求包括表65.

參見this question關於要求的討論。

0

問題需要一些更多的細節,像你的vec類。

到底是什麼錯誤?請分享有關錯誤的更多信息。控制檯日誌會很有幫助。

std :: copy需要兩個輸入迭代器(http://www.cplusplus.com/reference/algorithm/copy/) 您確定像類的向量正確處理迭代器嗎?

另請檢查您的vec是否支持back_inserter所需的容器需求。 http://www.cplusplus.com/reference/iterator/back_inserter/

+0

-1:這裏有幾個問題。首先,提供了足夠多的細節,至少對問題進行相當密切的猜測。查看其他答案。其次,這個「答案」實際上只是OP的一堆問題,要求澄清。因此,這應該發佈爲*評論*,而不是*答案*。 –

+0

我沒有足夠的積分來發表評論。 – atuljangra

1

嘗試增加

的typedefŤVALUE_TYPE;
typedef const value_type & const_reference;

在你的vec < T>身體。