2012-09-06 22 views
0
struct MyStruct 
{ 
    MyStruct() {} 
}; 
struct MySndStruct 
{ 
    MySndStruct() {} 
}; 

template <typename T> 
T Func(const T& t = T()) 
{ 
    T ret; 
    return ret; 
} 

template <> 
MyStruct Func<MyStruct>(const MyStruct& ms) 
{ 
    MyStruct ret; 
    return ret; 
} 
int main() 
{ 
    Func<MySndStruct>(); 
    Func<MySndStruct>(); // Works 

    Func<MyStruct>(); 
    Func<MyStruct>(); // Fails 
    Func<MyStruct>(MyStruct()); // Works fine 
    return 0; 
} 

的MYSTRUCT專業化爲Func鍵的第二次調用失敗,並在Visual C以下錯誤++ 2010爲什麼在第二次調用時使用默認參數時,此模板特化失敗?

error C2440: 'default argument' : cannot convert from 'MyStruct *' to 'MyStruct & 

如果我通過由值而不是通過引用(MyStruct Func<MyStruct>(MyStruct ms))的誤差變

fatal error C1001: An internal error has occurred in the compiler. 

這是Microsoft的C++編譯器中的錯誤還是默認參數不支持模板特化?

如果任何人都可以向我解釋這裏發生了什麼,例如,爲什麼編譯器假設一個指針傳入時顯然不是IMO?爲什麼第一次調用工作?我認爲它與實例化模板有關,但我想更準確地知道。

編輯:更新的參數爲const突出,這不就VISUAL C++的差異2010年

+1

第一個錯誤'(T&t = T())'。標準不能將臨時綁定到引用。代碼編譯罰款後gcc修復此問題後:http://liveworkspace.org/code/1b8fecded33ebc25a6eb8519c6a083ea – ForEveR

+0

感謝ForEverR。您建議的修補程序不適用於Visual C++ 2010.這是否意味着它是編譯器中的錯誤? – hanDerPeder

+0

不要在MSVC 2010中爲我工作,但在MSVC 2012 RC中運行良好。 – ForEveR

回答

1

取代T Func(T& t = T())T Func(const T& = T()),並應當編制罰款。

+0

MSVC狡猾。 http://stackoverflow.com/questions/11508607/rvalue-to-lvalue-conversion-visual-studio – ForEveR

+0

將const添加到參數給出完全相同的錯誤。也許我應該在原來的問題中提到這個問題,但這是無關緊要的,所以我把它排除了。 – hanDerPeder

+0

對不起,不適合我(使用gcc 4.7.0)。所以我不能在這裏幫忙...但是你應該用'const'來問這個問題。 – Walter

相關問題