2016-07-07 57 views
3

以下是行和列的动态数我矩阵类的一部分,这个类行主要为了存储矩阵元素使用std::vectorMSVC 2015年选择不正确的构造函数重载的std ::矢量


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正在按照我的意图使用上面引用的第三个构造函数。

为什么MSVC没有选择正确的构造函数,调用std::vector而GCC是,我能做些什么来缓解呢?

+0

如果使用'mtx {_rows * _cols,alloc}'代替会发生什么? – NathanOliver

+0

我仍然担心同样的错误。 – ArchbishopOfBanterbury

+0

如果分配器对你来说不是那么重要,那么它可以工作,如果你把它分开。 –

回答

3

状态更新

的错误已得到修复并运VS 2015年更新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()); 

形式,并提供一个值工作用来构建元素。

+0

我明白了,谢谢你的错误报告 - 我以前认为MS现在已经应用了这个改变。 – ArchbishopOfBanterbury

+0

@ArchbishopOfBanterbury同样在这里。它一定被忽视/有人检查了它,但忘了做这项工作;) – NathanOliver

+0

@ArchbishopOfBanterbury增加了一个可能的解决方法。 – NathanOliver