2016-05-13 94 views
2

對於下面的代碼:的Visual Studio C2580默認關鍵字

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; 
} 

我得到一個錯誤信息:

錯誤C2580 '的s :: S(無效)':的多個版本拖欠特別 不允許會員功能

我不明白。我認爲這個錯誤是由模板構造函數引起的(通過註釋並驗證程序編譯來驗證它)。

+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

但我認爲模板實例化永遠不可能是正常的構造函數之一 - 當然這可能是一個VC錯誤。 –

+0

@MartinBonner我猜這是一個錯誤,但後來我需要修復... –