Pau*_*zak 14 c++ stl c++11 visual-studio-2013
这段代码片段:
enum {N = 10, M = 100};
vector<int> v(N, M);
由于以下错误,无法使用Visual Studio 2013进行编译:
错误C2838:'iterator_category':成员声明中的非法限定名称
它出什么问题了?
Mar*_* A. 12
这是VS2012和VS2013中的一个错误,因为它不符合C++ 11标准(_HAS_CPP0X定义为1):
C++ 03 23.1.1 [lib.sequence.reqmts]/9说:
对于本节和第21节中定义的每个序列:
- 构造函数
template <class InputIterator> X(InputIterator f, InputIterator l, const Allocator& a = Allocator())应具有与以下相同的效果:
X(static_cast<typename X::size_type>(f), static_cast<typename X::value_type>(l), a)如果InputIterator是一个整体类型.
但是来自C++ 11 23.2.3 [sequence.reqmts]/14:
对于本条款和第21条中定义的每个序列容器:
- 如果
template <class InputIterator> X(InputIterator first, InputIterator last, const allocator_type& alloc = allocator_type())使用InputIterator不符合输入迭代器的类型调用构造函数,则构造函数不应参与重载决策.
根本不应该考虑那个构造函数
更多信息:https://stackoverflow.com/a/12432482/1938163
作为一种解决方法,您可以" 稍微帮助过载分辨率 ",例如
std::vector<int> v(static_cast<std::vector<int>::size_type>(N), M);