在我的代码我有注册其他类别的方法的一类:替代无效的作为参数传递给模板方法
#include <iostream>
using namespace std;
template< typename C>
class Reg {
public:
template< typename R, typename A>
void register_f(string name, R (C:: *method_p) (A)) { /*registration process*/ }
// template< typename R>
// void register_void_f(string name, R (C:: *method_p) (void)) { /*registration process*/ }
};
class A {
public:
int f(void) { return 1; }
void g(int x) { /* some code*/ }
};
int main() {
Reg< A> r;
r.register_f("g", &A::g);
/*1*/// r.register_f("f", &A::f);
/*2*/// r.register_f< int, void>("f", &A::f);
/*3*/// r.register_void_f< int>("f", &A::f);
return 0;
}
取消注释行/ * 2 * /给我一个错误:
template argument deduction/substitution failed:
In substitution of ‘template void register_f(std::string, R (C::*)(A)) [with R = R; A = A; C = A] [with R = int; A = void]’:
error: invalid parameter type ‘void’
线/ * 1 /相同/ 2 * /,但并非如此信息的错误消息。
我明白,要解决我可以使用方法register_void_f的问题,但我不想这样做,因为register_f是我最后的API的一部分。
问题>如何解决编译错误而不引入register_void_f?
我有一个想法解决它与部分专业register_f,但我不知道该怎么做,因为在C++中,你不能部分专门化模板方法。
PS>我不能使用C++ 11。
谢谢雅克,奇怪的是它有效! http://ideone.com/Jk3NOp – 2014-09-22 14:26:51
我认为这将很难专业化。 – 2014-09-22 14:27:38
@ValentinT。重写不是专业化。专业化是不同的,并且*通常*与功能不好的想法(你最好重写)。如果你需要花哨的专业化,你通常会转向一门专业机械课程,而不是专业化的功能模板。 – Yakk 2014-09-22 14:32:34