次の方法で共有


コンパイラ エラー C2797

(現在不使用) メンバー初期化子のリストまたは非静的データ メンバーの初期化子内のリストの初期化は実装されていません。

Visual Studio 2015 では、この警告は廃止されています。 Visual Studio 2013 以前のバージョンでは、Microsoft C++ コンパイラでは、メンバー初期化子リスト、または、非静的データ メンバーの初期化子のいずれの内部にも、リスト初期化を実装していません。 Visual Studio 2013 Update 3 より前は、これはサイレントに関数呼び出しに変換され、これにより、不適切なコードが生成される可能性がありました。 Visual Studio 2013 Update 3 ではこのことがエラーとして報告されます。

この例では、C2797 が生成されます。

#include <vector>
struct S {
    S() : v1{1} {} // C2797, VS2013 RTM incorrectly calls 'vector(size_type)'

    std::vector<int> v1;
    std::vector<int> v2{1, 2}; // C2797, VS2013 RTM incorrectly calls 'vector(size_type, const int &)'
};

また、この例では C2797 も生成されます。

struct S1 {
    int i;
};

struct S2 {
    S2() : s1{0} {} // C2797, VS2013 RTM interprets as S2() : s1(0) {} causing C2664
    S1 s1;
    S1 s2{0}; // C2797, VS2013 RTM interprets as S1 s2 = S1(0); causing C2664
};

この問題を解決するには、内部リストの明示的な構築を使用できます。 次に例を示します。

#include <vector>
typedef std::vector<int> Vector;
struct S {
    S() : v1(Vector{1}) {}

    Vector v1;
    Vector v2 = Vector{1, 2};
};

リストの初期化が必要ない場合:

struct S {
    S() : s1("") {}

    std::string s1;
    std::string s2 = std::string("");
};

(Visual Studio 2013 Update 3 より前は、Visual Studio 2013 の コンパイラによって暗黙的にこのことが行われました。)