2015-07-12 97 views
4

我在使用新的C++ 11 using關鍵字時遇到問題。據我瞭解,這是typedef的別名。但我無法得到它編譯。我想爲一個std::vector的迭代器定義一個別名。如果我使用這一切,完美的作品。使用與typedef for std :: vector :: iterator

typedef std::vector<fix_point>::iterator inputIterator; 

但如果我嘗試:

Error: 'std::vector<fix_point>' is not a namespace 
using std::vector<fix_point>::iterator = inputIterator; 
          ^

爲什麼不這樣編譯:

using std::vector<fix_point>::iterator = inputIterator; 

的代碼不編譯?

回答

14

你只把它向後:

using inputIterator = std::vector<fix_point>::iterator; 

別名語法排序鏡子變量聲明的語法:你介紹名字那張=的左側。

9

typedef是一個說明符,可以與其他說明符混合使用。因此下面的typedef聲明是等價的。

typedef std::vector<int>::iterator inputIterator; 
std::vector<int>::iterator typedef inputIterator; 

與typedef聲明相反,alias聲明具有嚴格的說明符順序。根據C++標準(7.1.3 typedef說明符)

typedef-name也可以通過別名聲明引入。 using關鍵字後面的 標識符變成typedef名稱,標識符後面的 可選屬性說明符seq將 指向該typedef-name。它具有與由typedef說明符引入的 相同的語義。特別是,它沒有定義 一個新類型,它不會出現在type-id中。

因此,你必須寫

using inputIterator = std::vector<int>::iterator ; 
+0

我不知道:第二個是合法的。我希望沒有人真的在代碼中使用它... – Barry

+0

@Barry它是我有時使用第二個聲明。:) –

相關問題