gpt4 book ai didi

c++ - 模板函数特化默认参数

转载 作者:搜寻专家 更新时间:2023-10-31 01:21:53 27 4
gpt4 key购买 nike

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 token 。但没有特化,它做得很好。如果我更改默认参数并且还在做特化:

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)

由于原来的问题是因为 bug,现在问题变成了如何解决它?

最佳答案

代码没有问题; Comeau Online、Intel C++ 11.1、g++ 4.1.2编译成功。

我猜这是编译器中的错误。我最近提交了一个相关但略有不同的 bug report针对 Visual C++ 2010 编译器。


作为解决方法,您可以包装调用:

template <typename T>
T get_limits_min() { return std::numeric_limits<T>::min(); }

template <typename T>
T get_limits_max() { return std::numeric_limits<T>::max(); }

template <typename T> void function(T arg1,
T min = get_limits_min<T>(),
T max = get_limits_max<T>())
{
}

丑陋?相当。


我发布了以下内容以回应 the bug you reported on Microsoft Connect:

主模板必须有一个具有默认参数值的参数。默认参数值必须是不在全局命名空间中的类模板的成员函数。

以下是可重现的最少代码:

namespace N
{
template <typename T>
struct S
{
static T g() { return T(); }
};
}

template <typename T> void f(T = N::S<T>::g()) { }

template <> void f<>(int) { }

int main()
{
f<int>();
}

编译器在定义主模板的行中发出以下错误:

error C2589: '::' : illegal token on right side of '::'
error C2059: syntax error : '::'

有趣的是,如果类模板在全局命名空间中,还有另一个问题。给定以下代码:

template <typename T>
struct S
{
static T g() { return T(); }
};

template <typename T> void f(T = ::S<T>::g()) { }

template <> void f<>(int) { }

int main()
{
f<int>();
}

编译器在定义主模板的行上发出以下错误:

error C2064: term does not evaluate to a function taking 0 arguments

这两个示例测试用例都是格式正确的 C++ 程序。

关于c++ - 模板函数特化默认参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3402338/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com