Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/164.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++_Templates_Template Meta Programming - Fatal编程技术网

C++ C++;可变模板类终止

C++ C++;可变模板类终止,c++,templates,template-meta-programming,C++,Templates,Template Meta Programming,半小时前我发现了可变模板参数,现在我完全上瘾了 我有一个基于静态类的微控制器输出引脚抽象。我想将多个输出管脚分组,以便将它们作为一个管脚处理。下面的代码可以工作,但我认为我应该能够在0参数而不是1参数上结束递归 template< typename pin, typename... tail_args > class tee { public: typedef tee< tail_args... > tail; static void set( bool

半小时前我发现了可变模板参数,现在我完全上瘾了

我有一个基于静态类的微控制器输出引脚抽象。我想将多个输出管脚分组,以便将它们作为一个管脚处理。下面的代码可以工作,但我认为我应该能够在0参数而不是1参数上结束递归

template< typename pin, typename... tail_args >
class tee {
public:

   typedef tee< tail_args... > tail;

   static void set( bool b ){
      pin::set( b );
      tail::set( b );   
   }   

};

template< typename pin >
class tee< pin > {
public:

   static void set( bool b ){
      pin::set( b );
   }   

};
template
等级发球台{
公众:
typedef三通tail;
静态无效集(布尔b){
引脚::设置(b);
尾:集合(b);
}   
};
模板
等级T形三通<销>{
公众:
静态无效集(布尔b){
引脚::设置(b);
}   
};
我尝试过这一点,但编译器(gcc)似乎没有考虑到这一点:

template<>
class tee<> : public pin_output {
public:

   static void set( bool b ){}   

};
模板
T类:公共引脚输出{
公众:
静态空集(bool-b){}
};

错误消息很长,但本质上说没有tee。我的tee是否有问题,或者是否可以结束递归

您最常见的情况至少需要
1
参数(
pin
),因此无法创建具有
0
参数的专门化

相反,您应该使用最一般的情况,即接受任何数量的参数:

template< typename... > class tee;
模板三级三通;
然后创建专门化:

template< typename pin, typename... tail_args >
class tee<pin, tail_args...> {
public:

   typedef tee< tail_args... > tail;

   static void set( bool b ){
      pin::set( b );
      tail::set( b );   
   }   

};

template<>
class tee<> {
public:

   static void set( bool b ){}   

};
template
等级发球台{
公众:
typedef三通tail;
静态无效集(布尔b){
引脚::设置(b);
尾:集合(b);
}   
};
模板
等级发球台{
公众:
静态空集(bool-b){}
};

您使用的是什么版本的GCC?是GCC 4.8吗?您是否通过了
-std=c++11
标志(也带有
-Wall
)?您的类型应为
模板类T形三通
,终止案例应为
模板类T形三通{}@Basile:4.7.2;我使用了-std=c++0x;使用-std=c++11-Wall不做任何更改@Kerrek:当我的类型是templateclass tee时,我如何识别/使用该列表的“头”?编辑:在阅读了Lol4t0的答案后,我有点理解你的意思,但我没有意识到我应该使用两个专业。太棒了,很有魅力,我在向上迈出了一小步:)