2017-09-09 7 views
0

要求通り、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はコード内に広がっていますので、基底のレイヤーをすべて変更しようとすると非常に苦痛になります。

ありがとうございます!

+3

問題を例示し、読者が簡単なコピーアンドペーストで試すことができる、完全ではあるが最小限の例を投稿してみませんか?今、コードではない言葉。実際に私はこのような例がないとしてこれを閉じるために投票することを義務付けられていますが、私はOPが事を修正する機会を持っていた前に、質問は一般的に早すぎると考えています。物を直す。 –

+0

例を準備するのに多くの時間が必要な場合は、おそらくそれに取り組んでいるコメントを投稿してください。 –

+0

Visual C++ [ゼロサイズのstd :: arrayを受け入れる](http://rextester.com/BKA1344) [mcve]を投稿してください。 –

答えて

0

は、いくつかの問題がありますが、大きなショーストッパー1はこれです:

#include <array> 
struct S { S(int); }; // Not default-constructible. 
std::array<S, 0> x {}; 

これは

エラーC2073で失敗:「のstd ::配列< S、0 >: :_Elems ':部分的に初期化された配列の要素は、デフォルトのコンストラクタを持っていなければなりません。

C++は長さゼロの配列を許さないので、std::array<T, 0>はまだ動作するはずですが、ちょっとしたトリッキーを使用して実装する必要があります。残念ながら、MSVCのトリッキーは壊れています。これはタイプT[1]のフィールドを返します。空の未使用のT要素を構築することができないため、ひどく失敗します。

私が見るこの唯一の方法は、RRCにデフォルトのコンストラクタを指定すること、またはstd::array<T, 0>を避けることです。

+0

ありがとうございました。私は実際には、私はそれを一緒に投げた上記の私の例をきれいにしようといくつかのそれを再生していたと私は同様の動作を見た。私はそれが私だけでなく、コンパイラの問題であることを確認しようとしていました。私は一度コンパイルすると、デバッグ作業は大丈夫ですが、コンパイルの問題をデバッグするのは難しい作業です。好奇心から、どこでMSVCがどのように振る舞うかなどを知ることができますか?このような他のことに遭遇した場合のトリックや提案? – tenspd137

+0

@ tenspd137このような問題については、特定の問題が疑われるコンパイラの出力に基づいて、MSVCに付属のヘッダファイルを確認して確認することができます。 – hvd

関連する問題