Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/158.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++ 模板类中的静态成员初始化_C++_C++11_Templates_Sfinae - Fatal编程技术网

C++ 模板类中的静态成员初始化

C++ 模板类中的静态成员初始化,c++,c++11,templates,sfinae,C++,C++11,Templates,Sfinae,我需要在模板类内部初始化一个静态bool,我试着这样做。我能看到的唯一区别是,我对类型参数T有一个约束,但这会导致编译错误,为什么?我怎样才能解决这个问题 代码如下: template<class T, class = typename enable_if<is_any_integral<T>::value>::type> class fraction { static bool auto_reduce; // ... }; templat

我需要在模板类内部初始化一个静态bool,我试着这样做。我能看到的唯一区别是,我对类型参数T有一个约束,但这会导致编译错误,为什么?我怎样才能解决这个问题

代码如下:

template<class T, class = typename enable_if<is_any_integral<T>::value>::type>
class fraction {
    static bool auto_reduce;

    // ...
};

template<class T, class = typename enable_if<is_any_integral<T>::value>::type>
bool fraction<T>::auto_reduce = true;
模板
类分数{
静态布尔自动减少;
// ...
};
模板
布尔分数::自动减少=真;
错误是:

错误:声明的嵌套名称说明符“
分数::
”未引用类、类模板或类模板部分专用化
bool分数::auto_reduce=true

也许更简单

template<class T, class V>
bool fraction<T, V>::auto_reduce = true;
模板
布尔分数::自动减少=真;
当你写作时

template<class T, class = typename enable_if<is_any_integral<T>::value>::type>
class fraction
模板
类分数

您说
fraction
是一个具有两个类型模板参数的类;
std::enable_if
if部分有助于为第二个参数指定默认值(并允许启用/不启用SFINAE工作),但
fraction
是一个带有两个参数的模板
class
,您必须同时引用这两个参数,并且无需为第二个参数初始化重复启用/不启用/默认部分
auto\u reduce

,但是您必须引入
V
模板
可以吗@水飲み鳥 - 考虑到
V
(as
T
)只是模板参数的名称;如果需要,还可以更改名称,并将
auto_reduce
初始化为
template bool fraction::auto_reduce=true;我将第二个命名为
V
,因为默认值是
void
,但绝对是任意的。在类声明中,您可以避免使用第二个参数的名称,因为它没有被使用(这只是SFINAE启用/不启用的技巧);但是在外部初始化一个
静态
变量时,您必须引用它,所以您必须给它一个(任意)名称。@max66谢谢您的评论。似乎初始化
静态
需要类模板的完整类型限定
分数
:在本例中,有两个类型参数(如您所说)。