2014-09-06 109 views
1

我想獲得一個迭代器到我的向量shared_ptr。它給我2編譯錯誤:共享指針的向量迭代器

syntax error : missing ';' before identifier 'begin' 
missing type specifier - int assumed. Note: C++ does not support default-int 

在代碼中,如果我用字符串或基本的東西替換矢量的條目類型,它編譯。 [當然那不是我想要的]。這是怎麼回事?

#include <vector> 
#include <unordered_map> 
#include <memory> 

template<class _Kty, class _Ty> class MyClass { 
public: 
    typedef std::shared_ptr<std::pair<_Kty, _Ty>> Entry; 

    // Vector containing pairs of the key & value 
    std::vector<Entry> container; 

    // Beginning iterator to the vector part 
    std::vector<Entry>::iterator begin() noexcept { 
     return containervector.begin(); 
    } 
}; 

回答

2

std::vector<Entry>::iterator依賴名。

使用typename爲關於編譯器一個暗示,嵌套::iterator東西

typename std::vector<Entry>::iterator begin() noexcept { 
// ^^^^^^^^ 

Q & A節:

爲什麼typedef std::string Entry;作品沒有typename

std::string是一個模板std::basic_string<char>的顯式實例,因此,編譯器知道這個類型及其嵌套成員類的一切。

爲什麼我需要typenameshared_ptr版本的代碼?

這是因爲std::vector<Entry>後面隱藏的內容取決於提供給模板的參數。也就是說,std::vector<Entry>::iterator將根據什麼Entry是變化,並且Entry本身利用模板參數(因爲它具有std::pair<_Kty, _Ty>),並且iterator構件可以不存在可言,或者它可以是例如一個靜態對象,而不是一個類型。 typename是編譯器的提示。

+0

工作!但我有另一個問題。我將typedef行改爲:typedef std :: string Entry;它編譯。爲什麼我需要shared_ptr版本的代碼的類型名稱? [&不是字符串版本] – RandomClown 2014-09-06 21:08:34

+1

@RandomClown:已更新 – 2014-09-06 21:18:00