C++如何正确定义返回模板类实例的模板函数返回类型
问题原因及修复方案
你的代码存在4处核心问题:
- 声明顺序错误:C++要求使用任意类型(包括模板类)前必须先完成声明/定义。你的代码中
Result类的success方法用到了PayloadResult模板类,但PayloadResult的定义写在Result类之后,编译器解析到success方法的返回值时还不知道PayloadResult是什么,就会抛出"No template named 'PayloadResult'"的错误。你换成std::array能编译是因为标准库头文件已经提前声明了这个模板类。 - 模板参数语法错误:
PayloadResult的模板定义语法缺失类型标记,正确写法是template <typename TPayload>(或用class代替typename也可),你当前写的template <TPayload>不符合C++语法规范。 - 类定义缺失结尾分号:C++中类/结构体定义结束后必须加英文分号,你的
Result和PayloadResult类定义完都没有加分号,也会导致编译报错。 - 成员函数逻辑错误:
PayloadResult的payload()成员函数中,你写的返回值是payload,会直接递归调用自身引发运行时问题,正确应该返回成员变量payload_。
修复后的完整代码如下:
// 先定义PayloadResult模板类,保证后续使用时编译器已经识别该类型 template <typename TPayload> class PayloadResult { private: TPayload payload_; public: PayloadResult(TPayload payload) { payload_ = payload; } TPayload payload() { // 修正返回值为成员变量 return payload_; } }; // 补全类定义结尾的分号 // 再定义Result类 class Result { public: template<class TPayload> PayloadResult<TPayload> success(TPayload payload) { return PayloadResult<TPayload>(payload); } }; // 补全类定义结尾的分号
如果确实需要把Result类定义放在代码前半部分,可以先对PayloadResult做模板前置声明,在文件最开头加一行template <typename TPayload> class PayloadResult;即可,不过因为success函数里用到了PayloadResult的构造函数,还是需要在success函数实现前完成PayloadResult的完整定义。
内容的提问来源于stack exchange,提问作者rombas
相关产品推荐
相关产品推荐

