Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/159.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在Visual Studio 2012中限制函数模板类型_C++_Visual C++_Visual Studio 2012_C++11 - Fatal编程技术网

C++ 在Visual Studio 2012中限制函数模板类型

C++ 在Visual Studio 2012中限制函数模板类型,c++,visual-c++,visual-studio-2012,c++11,C++,Visual C++,Visual Studio 2012,C++11,Visual Studio 2012中是否有任何方法将函数模板限制为特定类型 这一个在GCC中工作,但MSVC生成错误C4519:默认模板参数仅允许在类模板上使用 #include <type_traits> template <class float_t, class = typename std::enable_if< std::is_floating_point<float_t>::value >::type> inline float_t

Visual Studio 2012中是否有任何方法将函数模板限制为特定类型

这一个在GCC中工作,但MSVC生成
错误C4519:默认模板参数仅允许在类模板上使用

#include <type_traits>

template <class float_t, class = typename std::enable_if< std::is_floating_point<float_t>::value >::type>
inline float_t floor(float_t x)
{
    float_t result;
    //...
    return result;
}
#包括
模板::类型>
内联浮动地板(浮动x)
{
浮动结果;
//...
返回结果;
}

交叉编译器解决方案是最好的。有其他选择吗?

通常,您会这样写

template <class float_t>
typename std::enable_if< std::is_floating_point<float_t>::value, float_t>::type
  floor(float_x x) {...}
模板
typename std::enable_if:type
地板(浮子x){…}

如果打算使用
的话,这就是启用的方式。

我不会说这是启用的方式,也不会说这是正常使用的方式。这只是为了绕过VS2012在函数中不支持默认模板参数的缺陷。@Rapptz:如果打算使用,这是启用_的最初方式。默认的函数模板参数是一个新的东西,相对于enable_if.@DeadMG我不会不同意。然而,由于C++11,它通常被放置在模板参数中。无论如何,如果你的编译器缺乏对它的支持,这是一个完美的解决方法。是的,这很公平。但是声称enable_if不打算像这样使用是完全错误的。这意味着在支持默认模板参数的编译器中,我的原始解决方案更适合C++11标准?