使用using和typedef定义std::vector::iterator有何区别?

4

在使用新的C++11 using关键字时,我遇到了问题。据我所知,它是typedef的别名。但是我无法编译它。我想为std::vector的迭代器定义一个别名。如果我使用这个,一切都能完美运行。

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;
                            ^

为什么这段代码无法编译?
2个回答

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名称。

在别名声明中,使用关键字后面的标识符成为typedef名称,后面的可选属性说明符序列适用于此typedef名称。它具有与typedef说明符引入时相同的语义。特别地,它不定义新类型,并且不应出现在类型ID中。

因此,您需要编写:

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

@Barry,有时候是我使用了第二个声明。 :) - Vlad from Moscow

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接