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;
}
Func の MyStruct 特殊化の 2 回目の呼び出しは、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 ではないのにポインターが渡されたと想定するのはなぜですか? そして、なぜ最初の呼び出しが機能するのでしょうか? テンプレートのインスタンス化と関係があると思いますが、もっと正確に知りたいです。
編集: Visual C++ 2010 では違いがないことを強調するために、パラメーターを const に更新しました。