如何解决C++模板函数中实现C++20 typeof()等价功能的编译错误
模板函数中获取容器元素类型的解决方法
问题根源
模板函数编译失败是因为多余使用了typename关键字:decltype(dummy)的结果不属于嵌套依赖类型,模板语境下typename只能用来标记依赖于模板参数的嵌套类型(比如T::value_type);非模板函数中编译器会忽略冗余的typename,但模板里会严格执行语法检查,因此报错。
几种可行的解决方法
方法一:移除多余的
typename
直接去掉typename即可通过编译:#include <iostream> #include <vector> #include <set> using namespace std; template <class T> auto func(T const &data) { auto dummy = *begin(data); using Y = decltype(dummy); // 去掉多余的typename vector<Y> vec; for (auto x: data) vec.push_back(x); return vec; } void func1() { set<int> data({1,2,4,5}); auto vec = func(data); for (auto y: vec) cout<<y<<endl; }方法二:直接使用容器的
value_type(更规范)
标准容器都自带value_type类型别名,用来表示元素类型,模板中需要加typename标记嵌套依赖类型:template <class T> auto func(T const &data) { using Y = typename T::value_type; // 直接用容器内置的元素类型别名 vector<Y> vec; for (auto x: data) vec.push_back(x); return vec; }方法三:省略dummy变量,直接推导元素类型
不需要额外定义dummy变量,直接通过迭代器解引用的结果推导类型:template <class T> auto func(T const &data) { using Y = decltype(*begin(data)); vector<Y> vec; for (auto x: data) vec.push_back(x); return vec; }如果容器迭代器返回的是引用类型(比如
const int&),想要得到值类型的话,可以用std::decay_t处理(需要包含<type_traits>头文件):#include <type_traits> template <class T> auto func(T const &data) { using Y = std::decay_t<decltype(*begin(data))>; vector<Y> vec; for (auto x: data) vec.push_back(x); return vec; }方法四:简化函数实现
直接利用vector的迭代器构造函数,省去手动循环:template <class T> auto func(T const &data) { return vector<typename T::value_type>(data.begin(), data.end()); }
内容的提问来源于stack exchange,提问作者thi
相关产品推荐
相关产品推荐

