派生类调用基类模板成员函数编译报错,求技术指导
问题分析与解决方案
核心错误点及修复步骤
- 函数名拼写不一致:基类A的模板函数名为
generate_value,但派生类B中调用的是generate_values(多了末尾的s),这是最直接的编译错误源。 - 语法错误:派生类B中
inner_generation的声明错误,多了一个左尖括号<,正确的声明应为torch::Tensor inner_generation(const size_t& column);。 - 基类模板函数的名字隐藏:即使修正函数名,派生类的成员函数会隐藏基类的同名模板函数,必须显式指定基类作用域,或者通过
using声明将基类模板函数引入派生类作用域。 std::function类型不匹配:基类模板函数的function参数是std::function<int(const Args&...)>,但inner_generation返回torch::Tensor,类型完全不匹配,需要修正基类模板的std::function模板参数。
修正后的完整代码
基类A的修正版
#include <vector> #include <functional> #include <torch/torch.h> class A{ protected: // 修正std::function的返回类型为torch::Tensor,匹配后续调用的函数 template<typename... Args> std::vector<torch::Tensor> generate_value(const size_t& generated_points, std::function<torch::Tensor(const Args&...)> function, const Args&... args); };
派生类B的修正版
class B : protected A{ public: B() : A(){} protected: // 方法1:显式指定基类作用域调用模板函数 std::vector<torch::Tensor> generate_values(const size_t& generated_points, const size_t& column){ return A::generate_value(generated_points, std::bind(&B::inner_generation, this, std::placeholders::_1), column); } // 方法2:如果需要频繁调用,可添加using声明引入基类模板函数 // using A::generate_value; // 之后可直接用this->generate_value(...)调用 // 修正语法错误,移除多余的左尖括号 torch::Tensor inner_generation(const size_t& column); };
补充说明
- 显式指定基类作用域:在派生类中调用基类被隐藏的模板函数时,必须用
A::generate_value明确指定,否则编译器只会在派生类作用域内查找同名函数,无法找到基类的模板版本。 std::function类型匹配:确保基类模板中std::function的返回类型和传入的函数(如inner_generation)返回类型一致,否则模板参数推导会失败,导致编译错误。std::bind的注意事项:绑定成员函数时,要确保所属类的正确性,这里inner_generation是B的成员函数,所以应该用&B::inner_generation而非&A::inner_generation(原代码中此处也有误)。
内容的提问来源于stack exchange,提问作者mas
相关产品推荐
相关产品推荐

