template <typename T> void function(T arg1,
T min = std::numeric_limits<T>::min(),
T max = std::numeric_limits<T>::max())
{
}
template <> void function<int>(int arg1, int min,int max)
{
}
int main(int argc,char* argv[])
{
function<int>(1);
}
トークンの関数のデフォルトの引数行に構文エラーC2689およびC2059が表示され::
ます。しかし、専門性がなければ、うまくいきます。そして、デフォルトの引数を変更しても、まだ特殊化を行っている場合:
template <typename T> void function(T arg1,
T min = T(0),
T max = T(1))
{
}
template <> void function<int>(int arg1, int min,int max)
{
}
問題もなくなりました。
今、私がこのようにそれを使用する場合:function<int>(1,2,3);
またはfunction<float>(1.0f)
それは素晴らしいので、テンプレート関数が特殊化されている場合、それを呼び出すときにデフォルトの引数を書き直す必要があるようです?
しかし、2番目のケースでは、呼び出し時に構文エラーがないstd::numeric_limits<T>::..
状態に置き換えますが、それはなぜですか?T(..)
function<int>(1)
(私はVisual Studio 2010 x64を使用しています)
元の問題はバグが原因であるため、質問は現在、それを回避する方法に変更されていますか?