【发布时间】:2014-11-16 12:58:11
【问题描述】:
在我的代码中,我有一个注册其他类的方法的类:
#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 void register_f(std::string, R (C::*)(A)) [with R = R; A = A; C = A] [其中 R = int; A = void]':
错误:无效的参数类型'void'
Line /* 1 / 与 / 2 */ 相同,但错误信息不那么丰富。
我知道要解决问题,我可以使用方法 register_void_f,但我不想这样做,因为 register_f 是我最终 API 的一部分。
问题>如何在不引入register_void_f的情况下修复编译错误?
我有一个想法用部分特化 register_f 解决它,但我不知道该怎么做,因为在 C++ 中你不能部分特化模板化方法。
PS>我不能使用 C++11。
【问题讨论】:
标签: c++ templates void member-function-pointers c++03