以下は動的な行数と列数を持つマトリックスクラスの一部です。このクラスでは行列優先順位で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 2015
:dynamic_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はこれを軽減するために何ができるのですか?
代わりに 'mtx {_rows * _cols、alloc}'を使うとどうなりますか? – NathanOliver
まだ私は恐れている同じエラーを返します。 – ArchbishopOfBanterbury
アロケータがそれほど重要でない場合は、アロケータを省略すると機能します。 –