在下面的示例中,如何找到成员函数f
的地址template<typename HANDLER>
void serialize(HANDLER &h) {
// Compiler error (gcc 4.8.1)
// test.cxx: In function ‘void serialize(HANDLER&)’:
// test.cxx:9:26: error: expected primary-expression before ‘int’
// auto x = &HANDLER::f<int>;
// ^
// test.cxx:9:26: error: expected ‘,’ or ‘;’ before ‘int’
auto x = &HANDLER::f<int>;
}
struct HandlerA {
template<typename T> void f() { }
};
struct HandlerB {
template<typename T> void f() { }
};
struct HandlerC {
template<typename T> void f() { }
};
int main() {
HandlerA a;
HandlerB b;
HandlerC c;
a.f<int>();
b.f<int>();
c.f<int>();
serialize(a);
serialize(b);
serialize(c);
}
答案 0 :(得分:4)
您需要告诉编译器f
是一个模板,以便它可以正确地解析函数:
auto x = &HANDLER::template f<int>;
答案 1 :(得分:0)
凯西是对的。
模板,在实例化之前没有地址。当模板使用(实例化)具有特定参数时,会创建内存中的唯一函数。
你可以使用/创建一个任何类型的实函数:int,char,float,double,classXYZ ......对于该函数的指针数量没有限制。