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

7
我在处理使用可变参数模板作为模板的成员函数的特化时遇到了困难。
以下示例对整个类进行了特化,它可以正常工作:
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

无论如何,简化的例子与实际情况类似。我希望错误不完全无关。

2
函数模板不能进行部分特化。 - T.C.
你是指“成员函数模板”吗? - skypjack
@skypjack:成员和非成员。 - Jarod42
该死。我完全忘记了,非常抱歉。错误确实很明显,但只有当你理解它时才足够清晰。谢谢。 :-) - skypjack
不专门化函数模板的好解释:http://www.gotw.ca/publications/mill17.htm - Vladimir Reshetnikov
1个回答

12

你不能对函数模板进行部分特化; 只允许显式特化。

通过重载,特别是使用诸如标签分派的概念,你可以获得几乎相同的效果。


不错的提示。我已经使用了标签分派,但今天没想起来!!谢谢你。 - skypjack
链接已损坏,您能修复它吗? - tuket
1
@tuket 链接已修复。 - TartanLlama

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接