c – 可变参数模板成员函数的部分特化

当使用可变参数模板进行模板化时,我正在努力使用成员函数的特化.

以下示例专门研究整个类,它工作正常:

template<typename... Args>
class C;

template<class T,typename... Args>
class C<T,Args...> { };

template<>
class C<> { };

int main() {
    C<int,double> c{};
}

下面的内容没有,即使它背后的想法与上面的想法完全相同:

class F {
    template<typename... Args>
    void f();
};

template<class T,typename... Args>
void F::f<T,Args...>() { }

int main() {
}

我收到以下错误,我不明白它是由于:

main.cpp:7:23: error: non-type partial specialization ‘f<T,Args ...>’ is not allowed
 void F::f<T,Args...>() { }
                       ^
main.cpp:7:6: error: prototype for ‘void F::f()’ does not match any in class ‘F’
 void F::f<T,Args...>() { }
      ^
main.cpp:3:10: error: candidate is: template<class ... Args> void F::f()
     void f();
          ^

在专门化功能模板时是否有一些我不知道的限制?

G版本是:g(Debian 5.2.1-23)5.2.1 20151028

编辑

顺便说一句,我从实际代码中得到的实际问题是:

non-class,non-variable partial specialization ‘executeCommand<T,Args ...>’ is not allowed

无论如何,简化的例子类似于真实的例子.我希望这些错误并非完全不相关.

解决方法

您不能部分专门化功能模板;只允许显式专门化.

使用重载可以获得几乎相同的效果,尤其是在使用诸如tag dispatching之类的概念时.

相关文章

本程序的编译和运行环境如下(如果有运行方面的问题欢迎在评...
水了一学期的院选修,万万没想到期末考试还有比较硬核的编程...
补充一下,先前文章末尾给出的下载链接的完整代码含有部分C&...
思路如标题所说采用模N取余法,难点是这个除法过程如何实现。...
本篇博客有更新!!!更新后效果图如下: 文章末尾的完整代码...
刚开始学习模块化程序设计时,估计大家都被形参和实参搞迷糊...