MSVC 2015为std :: vector选择了错误的构造函数重载

时间:2016-07-07 17:39:27

标签: c++ gcc visual-c++

以下是我的矩阵类的一部分,它具有动态的行数和列数,该类在行主要顺序中使用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是,我该怎么做才能缓解这种情况?

1 个答案:

答案 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());

并提供一个值来构造元素。