C++ 模板类中的静态成员初始化
我需要在模板类内部初始化一个静态bool,我试着这样做。我能看到的唯一区别是,我对类型参数T有一个约束,但这会导致编译错误,为什么?我怎样才能解决这个问题 代码如下: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
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
(asT
)只是模板参数的名称;如果需要,还可以更改名称,并将auto_reduce
初始化为template bool fraction::auto_reduce=true代码>;我将第二个命名为V
,因为默认值是void
,但绝对是任意的。在类声明中,您可以避免使用第二个参数的名称,因为它没有被使用(这只是SFINAE启用/不启用的技巧);但是在外部初始化一个静态变量时,您必须引用它,所以您必须给它一个(任意)名称。@max66谢谢您的评论。似乎初始化静态
需要类模板的完整类型限定分数
:在本例中,有两个类型参数(如您所说)。