为什么C++模板函数不支持返回指针?附相关代码示例
C++模板函数完全支持返回指针!
哎,你可能误会啦——C++模板函数绝对支持返回指针类型,你写的代码思路本身没问题,大概率是踩了「模板参数推导」的小坑,才导致你以为它不支持~
先看你代码里的核心问题:当你在main里调用getRandom()的时候,没有显式指定模板参数<int>。因为你的模板函数getRandom的参数列表里没有用到模板类型T,编译器没办法自动推导T到底是什么类型,所以必须手动告诉它你要实例化的是int版本的函数。
给你修正后的完整可运行代码:
#include <iostream> using namespace std; // 生成并返回数组指针的模板函数 template<typename T> T * getRandom( ) { static T r[10]; for (int i = 0; i < 10; ++i) { r[i] = 111; cout << r[i] << endl; } return r; } int main () { int *p; // 必须显式指定模板参数<int>,让编译器知道要实例化int类型的版本 p = getRandom<int>(); for ( int i = 0; i < 10; i++ ) { cout << "*(p + " << i << ") : "; cout << *(p + i) << endl; } return 0; }
再给你划几个重点:
- 模板函数返回指针的语法完全合法,没有任何限制,你的
T*写法是对的 - 静态数组
r的使用是安全的:静态变量的生命周期和整个程序一致,函数结束后它不会被销毁,所以返回它的指针不会出现悬垂指针问题 - 如果想让编译器自动推导模板参数,可以修改函数,把
T放到参数列表里,比如:
调用时写template<typename T> T * getRandom(T /* 用一个 dummy 参数来推导类型 */) { static T r[10]; // 函数体不变 return r; }p = getRandom(0);,编译器会根据实参0的int类型自动推导出T=int,不过这种方式不如显式指定直观。
内容的提问来源于stack exchange,提问作者uniqueliu
相关产品推荐
相关产品推荐

