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)
все в порядке, поэтому кажется, что если функция шаблона специализирована, мы должны переписать аргумент по умолчанию при ее вызове?
но во втором случае, когда я заменил std::numeric_limits<T>::..
на T(..)
, при вызове function<int>(1)
синтаксической ошибки не было, почему?
(Я использую Visual Studio 2010 x64)
поскольку первоначальная проблема возникла из-за ошибки, вопрос теперь изменился на как ее обойти?