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

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 に更新しました。

4

1 に答える 1

1

に置き換えるT Func(T& t = T())T Func(const T& = T())、正常にコンパイルされます。

于 2012-09-06T12:35:20.713 に答える