C++ MSVC 2015为std::vector选择了不正确的构造函数重载
下面是我的matrix类的一部分,它具有动态的行数和列数,这个类使用一个C++ MSVC 2015为std::vector选择了不正确的构造函数重载,c++,gcc,visual-c++,C++,Gcc,Visual C++,下面是我的matrix类的一部分,它具有动态的行数和列数,这个类使用一个std::vector按行主顺序存储矩阵元素 动态矩阵 template<typename _Ty, class _Alloc = std::allocator<_Ty> > class dynamic_matrix { public: typedef _Ty value_type; typedef std::size_t size_type; typedef _Al
std::vector
按行主顺序存储矩阵元素
动态矩阵
template<typename _Ty,
class _Alloc = std::allocator<_Ty>
> class dynamic_matrix {
public:
typedef _Ty value_type;
typedef std::size_t size_type;
typedef _Alloc allocator_type;
// various other typedefs, not relevant here...
explicit dynamic_matrix(size_type _rows, size_type _cols, const _Alloc& alloc = _Alloc())
: mtx(_rows*_cols, alloc), rows_(_rows), cols_(_cols) {}
explicit dynamic_matrix(size_type _rows, size_type _cols, const value_type& _val,
const _Alloc& alloc = _Alloc()) : mtx(_rows*_cols, _val, alloc), rows_(_rows), cols_(_cols) {}
// other constructors and methods omitted...
private:
std::vector<_Ty, _Alloc> mtx;
size_type rows_;
size_type cols_;
};
我从MSVC 2015中得到以下错误:
std::vector<_Ty,_Alloc>::vector(std::initializer_list<int>,const std::allocator<_Ty>&)
: cannot convert argument 2 from 'const std::allocator<_Ty>' to 'const int&'
在上面的dynamic_matrix
代码片段中使用第二个构造函数可以很好地编译GCC和MSVC
问题似乎是,出于某种原因,MSVC将构造函数调用mtx(\u rows*\u cols,alloc)
解释为第七个构造函数,这将解释无法从const std::allocator转换为const int&
错误消息。然而,GCC似乎正在按照我的意图使用上述参考中的第三个构造函数
为什么MSVC没有选择正确的构造函数从
std::vector
调用,而GCC正在调用,我可以做些什么来缓解这种情况?状态更新
该缺陷已修复,并在VS 2015更新3中发布
通过查看MSV中的向量头,没有具有以下形式的构造函数
explicit vector( size_type count, const Allocator& alloc = Allocator() )
但它确实有
explicit vector(size_type _Count)
这是一个C++11添加的构造函数,在C++14中更改为以前的构造函数。MSV似乎还没有赶上这一变化
真正奇怪的是vector
的专门化在头文件中有正确的构造函数,如果您使用
dynamic_matrix<bool> dm(10, 10);
并提供一个值来构造元素。如果使用mtx{{u rows*\u cols,alloc}会发生什么情况?恐怕还是会出现同样的错误。如果分配器对您来说不是那么重要,如果您不使用它,它会起作用。实际上。。。如果我查看MSVC中的STL源代码,我没有看到接受计数和分配器的构造函数。我可能误解了这一点,但我认为您尝试使用的构造函数在MSVC中根本不存在,无论是偶然还是偶然。但是,有一个用于计数、填充值和分配器的构造函数,所以你可以考虑使用它。我知道,感谢bug报告——我想MS现在已经应用了这个改变。一定是被忽略了/有人检查过了,但忘了做这项工作;)@班特伯里大主教增加了一个可能的解决方法。是的,那会奏效的,我可以使用这个构造函数,并默认初始化值作为第二个参数。
explicit vector(size_type _Count)
dynamic_matrix<bool> dm(10, 10);
vector( size_type count,
const T& value,
const Allocator& alloc = Allocator());