以下是我的矩阵类的一部分,它具有动态的行数和列数,该类在行主要顺序中使用std::vector
来存储矩阵元素。
dynamic_matrix
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_;
};
当我尝试使用上面显示的代码段中的第一个构造函数构建dynamic_matrix
并进行以下测试时,
int main(void) {
dynamic_matrix<int> dm(10,10);
}
我从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&'
然而,使用以下命令在GCC 6.1.0
中编译它不会产生警告或错误,
g++-6.1.0 --std=c++14 -Wall -pedantic -o maintest main.cpp dynamic_matrix.h
使用上面dynamic_matrix
代码段中的第二个构造函数可以很好地为GCC和MSVC编译。
问题似乎是MSVC由于某种原因将构造函数调用mtx(_rows*_cols, alloc)
解释为此reference中的第7个构造函数,它将解释cannot convert from const std::allocator to const int&
错误消息。而GCC似乎正在使用上述参考文献中的第3个构造函数。
为什么MSVC没有选择正确的构造函数来从std::vector
调用,而GCC是,我该怎么做才能缓解这种情况?
答案 0 :(得分:3)
状态更新
该错误已得到修复,并已在VS 2015 Update 3中发布
查看MSVS中的向量标题,没有构造函数的格式为
explicit vector( size_type count, const Allocator& alloc = Allocator() )
但确实有
explicit vector(size_type _Count)
这是一个C ++ 11添加的构造函数,它在C ++ 14中被改为以前的构造函数。似乎MSVS尚未赶上这一变化。
奇怪的是vector<bool>
的特化在头文件中有正确的构造函数,如果你使用
dynamic_matrix<bool> dm(10, 10);
它会编译。
我已向MS提交了错误报告,您可以看到它here
在解决此问题之前,您可以使用
形式的构造函数vector( size_type count,
const T& value,
const Allocator& alloc = Allocator());
并提供一个值来构造元素。