要求通り、cygwinでコンパイルして実行するコードファイルがありますが、テンプレート関数のパラメータとして使用することは、GCCに大丈夫ではなく、MSVS: 入力サイズ:0空のinitalizerをパルメータとして使用するC++ 11のコードはGCC 4.8,7、CygwinではコンパイルされますがMSVSではコンパイルされません2017
// TestError.cpp : Defines the entry point for the console application.
//
#include <iostream>
#include <array>
#include <vector>
template <typename T>
class otherclass
{
public:
T* allocated;
otherclass(int n) { allocated = new T[n]; }
~otherclass() { delete[] allocated; }
};
class otherclass_accessor
{
public:
int sz;
otherclass_accessor(int inputSize) : sz(inputSize) {}
};
template<typename T>
class baseclass : public otherclass_accessor
{
private:
std::vector<T*> mPointers;
public:
T const * const * sp;
std::vector<T> someVector;
baseclass(std::vector<T>& someVector) : otherclass_accessor(someVector) {}
~baseclass() { mPointers.resize(0); }
};
class RRC : public baseclass<int>
{
public:
template <typename T> RRC(otherclass<T>& a) : baseclass<void>(reinterpret_cast<otherclass<void>&>(a)) {}
template< typename T > operator baseclass<T> const &() const { return reinterpret_cast< baseclass<T> const & >(*this); }
};
template< int N > using ARRC = std::array<RRC, N>;
template <int A>
void run_filter_multi(ARRC<A> in)
{
std::cout << "Input Size:" << in.size() << std::endl;
}
int main()
{
run_filter_multi<0>({});
return 0;
}
は、G ++ -std = C++ 11 TestError.cpp -o試験 出力でコンパイル
MSVS2017でエラーC2664が発生する:
1> ------ビルド開始:プロジェクト:TestError、構成:デバッグWin32 ------ 1> TestError.cpp 1> c:\ users \ dayd \ documents \ visualスタジオ2017 \ projects \ 'initialize list'から 'std :: array'に引数1を変換できません。 1> c:\ users \ testerror \ testerror.cpp(53):エラーC2664: 'void run_filter_multi < 0>(std :: array) dayd \ documents \ visual studio 2017 \ projects \ testerror \ testerror.cpp(53):注:無効な集計の初期化 1>ビルドプロジェクト "TestError.vcxproj" - FAILED。 ==========ビルド:0成功、1失敗、0最新、0スキップ==========
だから私の質問はなぜですか?空のイニシャライザはg ++で大丈夫ですが、MSVS2017ではできません。これは、私が "クロスプラットフォーム"を作ろうとしているはるかに大きなプロジェクトで経験していたことを模擬しようとした、疲れたバージョンです。私はMSVSでそれを回避する方法は考えられないようです。 std :: arrayの代わりにstd :: vectorを使用しようとしましたが、std :: arrayはコード内に広がっていますので、基底のレイヤーをすべて変更しようとすると非常に苦痛になります。
ありがとうございます!
問題を例示し、読者が簡単なコピーアンドペーストで試すことができる、完全ではあるが最小限の例を投稿してみませんか?今、コードではない言葉。実際に私はこのような例がないとしてこれを閉じるために投票することを義務付けられていますが、私はOPが事を修正する機会を持っていた前に、質問は一般的に早すぎると考えています。物を直す。 –
例を準備するのに多くの時間が必要な場合は、おそらくそれに取り組んでいるコメントを投稿してください。 –
Visual C++ [ゼロサイズのstd :: arrayを受け入れる](http://rextester.com/BKA1344) [mcve]を投稿してください。 –