带模板成员函数的模板类显式实例化及成员函数指针获取问题
C++类模板及成员模板函数显式实例化方案
核心问题说明
你直接写auto eval_ptr = &A<int>::Eval存在歧义的根本原因:Eval本身是独立的成员模板,参数D没有被指定,编译器无法判断你要获取哪个实例的指针。另外你提供的类定义存在笔误:构造函数初始化列表初始化的a_和类内声明的成员a命名不统一,需要先修正。
实现步骤
1. 修正类定义
template <typename T> class A { private: // 统一成员命名为a_,匹配初始化列表 T a_; public: A(T& a) : a_(a) { } template <typename D> void Eval(D& arg) { // 你的业务逻辑 } };
2. 显式实例化类模板+指定版本的成员模板函数
假设你需要使用的Eval的模板参数D为int类型,显式实例化写法如下:
// 显式实例化整个A<int>类 template class A<int>; // 单独显式实例化D为int的Eval成员模板函数 template void A<int>::Eval<int>(int&);
如果需要支持多个D类型的Eval实例,为每个类型单独写一行显式实例化语句即可。
补充:如果要拆分声明实现到不同编译单元,在头文件中添加
extern template class A<int>;和extern template void A<int>::Eval<int>(int&);,可以避免多个编译单元重复生成实例,减小目标文件体积。
3. 获取无歧义的成员函数指针
有两种写法可选:
写法1:指定模板实参+auto推导
// 明确指定D的类型为int,消除歧义 auto eval_ptr = &A<int>::Eval<int>;
写法2:明确声明指针类型,让编译器自动推导模板实参
// 直接写完整的成员函数指针类型,编译器会自动推导D为int void (A<int>::*eval_ptr)(int&) = &A<int>::Eval;
内容的提问来源于stack exchange,提问作者Jonas Hjulstad
相关产品推荐
相关产品推荐

