2016-07-07 3 views
3

以下は動的な行数と列数を持つマトリックスクラスの一部です。このクラスでは行列優先順位でstd::vectorを使用しています。MSVC 2015が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 2015dynamic_matrixコードスニペットにおける第二のコンストラクタは、上記GCCとMSVCの両方に微細コンパイル使用して、次のコマンド収量ない警告やエラーでGCC 6.1.0でこれをコンパイルする一方

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&' 

g++-6.1.0 --std=c++14 -Wall -pedantic -o maintest main.cpp dynamic_matrix.h 

MSVCは何らかの理由でreferenceのコンストラクタコールmtx(_rows*_cols, alloc)を7番目のコンストラクタとして解釈し、cannot convert from const std::allocator to const int&エラーメッセージを説明しているようです。 GCCは、私が意図したように、上記のリファレンスから3番目のコンストラクタを使用しているようです。

std::vectorから電話する正しいコンストラクタをMSVCが選択しないのに対して、GCCはこれを軽減するために何ができるのですか?

+0

代わりに 'mtx {_rows * _cols、alloc}'を使うとどうなりますか? – NathanOliver

+0

まだ私は恐れている同じエラーを返します。 – ArchbishopOfBanterbury

+0

アロケータがそれほど重要でない場合は、アロケータを省略すると機能します。 –

答えて

3

はバグが修正され、フォーム

explicit vector(size_type count, const Allocator& alloc = Allocator()) 
とコンストラクタがないMSVSのベクトルヘッダを通じて探し


Update 3のVS 2015年に出荷されたステータス更新

しかし、それはあります

explicit vector(size_type _Count) 

これは、C++で追加されたコンストラクタであり、C++で以前のコンストラクタに変更されました。 MSVSはまだその変更に追いついていないようです。本当に奇妙である何

vector<bool>のための専門は、ヘッダーファイル内の適切なコンストラクタを持っていないということです、あなたが

dynamic_matrix<bool> dm(10, 10); 

を使用する場合には、コンパイルします。

私はMSにバグレポートを提出しており、これは、あなたが

vector(size_type count, 
      const T& value, 
      const Allocator& alloc = Allocator()); 

の形でコンストラクタを使用して値を供給することができ、固定されるまで、あなたの周りの仕事としてそれをhere

を見ることができますで要素を構築する。

+0

バグレポートのおかげで、私はMSがこの変更を今までに適用したと思っていたでしょう。 – ArchbishopOfBanterbury

+0

@ArchbishopOfBanterburyここにも同じです。見落とされているはずです/誰かがそれをチェックしましたが、仕事を忘れていました;) – NathanOliver

+0

@ArchbishopOfBanterbury可能な回避策を追加しました。 – NathanOliver

関連する問題