2016-05-13 2 views
2

を使用している場合:Visual StudioのC2580次のコードの場合、デフォルトのキーワード

エラーC2580 'S :: S(無効)':複数のバージョンの

struct S 
{ 
    S() = default; 
    S(S const&) = default; 
    S(S&&) = default; 

    S& operator=(S const& other) = default; 
    S& operator=(S&&) = default; 

    template <typename... T> 
    S(T&&... params) 
    { 
    } 
}; 

int main() 
{ 
    S s; 
    return 0; 
} 

私はエラーメッセージが表示されますデフォルトの特別 メンバー機能は許可されていません

私は分かりません。私は、エラーがテンプレートのコンストラクタによって(検証し、コメントアウトしてプログラムをコンパイルしている)原因と考えています。

+0

を私は 'S(S &&);は'カスタム実装を持っている必要がありますねこれは渡されるパラメータのメモリ領域(すなわちデータ)を盗み出す関数であるため、それ以外の場合は 'S(S const&);と同じになります'同じことが 'operator =' – sameerkn

+0

に当てはまります実際にこれをあなたのコンパイルエラーのポイントまで実行する 'main()'は、この質問をかなり頑強にします。おそらく質問を更新してください。 – WhozCraig

+1

あなたのテンプレートコンストラクタは、あなたのdefaコンパイラはあなたが何をしたいのか分からないからです。これは、デフォルトコンストラクタ、コピーコンストラクタ、または移動コンストラクタです。あなたはそれがデフォルトであると言いましたが、カスタム実装も提供しています。 – xaxxon

答えて

2
template <typename... T> 
    S(T&&... params) 
    { 
    } 

Tはデフォルトコンストラクタであなたを残して空にすることができ、それは移動コンストラクタであなたを残しS&&をすることができ、またはそれはコピーコンストラクタであなたを残してconst S &ことができます。

しかし、あなたはそれらのデフォルトバージョンがほしいとコンパイラに指示したので、それらのそれぞれについて明示的に定義したので混乱します。

それが問題を引き起こしているだけデフォルトコンストラクタですが、このコードは、コンパイラがクラッシュするので、私は、解決策として、以下を提案する:

struct S 
{ 
    S() = default; 
    S(S const&) = default; 
    S(S&&) = default; 

    S& operator=(S const& other) = default; 
    S& operator=(S&&) = default; 

    template <typename S, typename... T> 
    S(S&& s, T&&... params) 
    { 
    } 
}; 

int main() 
{ 
    S s; 
    return 0; 
} 
+3

を待たなければならないと思っていますが、私はテンプレートのインスタンス化が決して普通のコンストラクタの1つになることはできないと考えました - これはもちろんVCのバグかもしれません。 –

+0

@MartinBonnerこれはバグだと思っていますが、修正が必要です... –

関連する問題