2015-07-12 3 views
4

У меня возникла проблема при использовании нового ключевого слова C++ 11 using. Насколько я понимаю, это псевдоним для typedef. Но я не могу его скомпилировать. Я хочу определить псевдоним для итератора std::vector. Если я использую это, все работает отлично.Использование vs. typedef для std :: vector :: iterator

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

Но если я стараюсь:

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

код не компилируется с:

Error: 'std::vector<fix_point>' is not a namespace 
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, объявление псевдонима имеет строгий порядок спецификаций. В соответствии со стандартом C++ (7.1.3 Спецификатор typedef)

Имя typedef также может быть введено путем объявления псевдонима. Идентификатор , следующий за ключевым словом using, становится typedef-name и необязательным атрибутом-спецификатором-seq после идентификатора, который содержит , этому typedef-name. Он имеет ту же семантику, как если бы он был , введенный спецификатором typedef. В частности, он не определяет новый тип и не должен отображаться в идентификаторе типа.

Таким образом, вы должны написать

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

Я понятия не имел, 2-й один был законным. Я надеюсь, что никто не использует его в коде ... – Barry

+0

@Barry Это я иногда использовал вторую декларацию. :) –