C 迭代器从Typedef std :: Map作为模板参数声明
C++ Iterator declare from typedef std::map as template argument
如何声明迭代器的模板参数图?
我知道我可以从主要函数作为另一个模板参数的参数传递,但是如果我不这样做,我该如何声明?
template< typename container >
int print_data( container map )
{
map::iterator iter; // this is wrong
return 0;
}
int main()
{
typedef std::map< int, double > Map;
Map new_map;
print_data< Map >( new_map );
}
而
map::iterator iter; // this is wrong
是真的。这仅仅是因为您在对象上使用范围分辨率运算符,而不是指定范围的内容,例如类名称或名称空间。因此:
typename container::iterator iter;
是正确的。注意typename
关键字很重要和强制性。您必须让编译器知道您要访问的相关名称是一种类型,因此该行将被解析为声明。
如果您能够使用C 11(或以后)编译器,则有几种声明iter
的方法。
-
如果您可以在一个语句中声明并初始化它,则可以使用:
auto iter = map.begin();
-
您也可以使用
decltype
推断出类型。using iterator_type = decltype(map.begin()); iterator_type iter;
我建议使用第一种方法。这是处理的代码较少。这也是一个更好的编程习惯,可以在一个语句中声明和初始化变量。
typename Container::iterator iter = ...;
编译器默认值将模板成员视为变量,如果是类型,则必须使用" TypeName"。
相关文章:
- 在C++中声明一个函数时,它需要有函数本身的参数吗
- 对可变参数使用声明.如何选择正确的功能
- Arduino C++在构造函数中用参数声明对象数组
- 标准::向量声明中使用的模板参数
- 当简单捕获中的标识符显示为参数的声明符 ID 时,没有编译器诊断
- 将类型声明为类型模板参数的模板参数的一部分是否合法?
- 构造函数/函数声明参数列表中的统一初始化
- C++ - 声明指向返回任何类型并获取任意数量参数的函数的指针
- 带参数的数据结构的全局声明
- C++使用默认模板参数键入别名和转发声明
- 警告:忽略模板参数上的属性..在 std::unique_ptr (-wignore 属性)的声明中
- C++声明模板参数阴影模板参数错误
- "extern"声明以及带有和不带参数列表的类模板实例的后续定义
- 如何使用参数声明实例?
- 采用nulltpr_t的构造函数:函数定义不声明参数
- c++ 函数定义不声明参数
- 在循环范围之外声明参数是否更有效?
- 在linux下使用mingw交叉编译器声明"参数"中的两种或多种数据类型
- Clang Format多行函数声明参数问题
- 氧-声明参数为可选的