2010-08-04 108 views
2
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)的

因为原来的问题是由于错误的,现在的问题变为如何解决办法呢?

回答

3

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

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


作为一种变通方法,你可以用呼叫:

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++程序。

+0

如何向Microsoft报告此错误? – uray 2010-08-04 03:31:21

+0

@uray:您可以通过我列出的错误报告链接在connect.microsoft.com上提交它;您必须登录并打开新的缺陷。如果你不想,我会尽量减少这个问题,以及我之前报告给一个普通样本的问题,并重新提交问题。让我知道;我很乐意提供帮助。 – 2010-08-04 03:33:27

+0

我现在报告错误。 – uray 2010-08-04 03:35:44

1

这里的答案是https://stackoverflow.com/a/13566433/364084https://stackoverflow.com/a/27443191/364084,这是由于在windows头文件中定义了min和max宏。下面的代码应该通过防止宏扩展来工作:

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