c++ ' using '命令用于模板类中的类型别名
C++ `using` command for type alias in template class
这看起来应该很简单,但我一直在玩,还没有找到我正在寻找的解决方案,所以这里是:
我有以下结构体(当然为了便于说明而简化):
template<typename T>
struct test
{
using L = std::list<T>;
L::iterator a;
};
现在,这会抛出错误:
error: need 'typename' before 'test<T>::K::iterator' because 'test<T>::K' is a dependent scope
到目前为止,我发现的两种修复方法都不太理想:
1)在使用L之前添加typename:
template<typename T>
struct test
{
using L = std::list<T>;
typename L::iterator a;
};
如果可能的话,我宁愿避免这额外的冗长。
2)添加另一个using语句直接指向迭代器:
template<typename T>
struct test
{
using L = std::list<T>;
using iter = typename L::iterator;
iter a;
};
但是,如果我还希望访问const_iterator
等等,那么这就需要对我想使用的每个迭代器做同样的事情,而且我宁愿不定义一堆using语句。
那么,有没有一种方法可以写using语句,然后允许我写:
L::iterator a;
L::const_iterator b;
...
谢谢!
typename
必须在那里,但是您可以使用一对别名模板实用程序来避免每次都定义新的iter
类型:
template<typename C>
using Iterator = typename C::iterator;
template<typename C>
using ConstIterator = typename C::const_iterator;
template<typename T>
struct test
{
using L = std::list<T>;
Iterator<L> i;
ConstIterator<L> ci;
};
不,没有。所有依赖类型必须以typename
开头,或者通过typename
开头。
list_iter<T>
using
声明:
template<typename T>
using list_iter = typename std::list<T>::iterator;
,甚至使用语句:
template<template<typename>class container, typename T>
using iter = typename container<T>::iterator;
template<template<typename>class container, typename T>
using const_iter = typename container<T>::const_iterator;
可以让你做:
struct test {
using L = std::list<T>;
iter<std::list,T> a;
};
我在struct
之外的using
声明中"隐藏"了typename
。
std::list
是错误的容器。
相关文章:
- 继承模板类中的类型别名
- 为什么 GCC 在使用类型别名时处理 const reinterpret_cast不同?
- 类作用域的类型别名"using":[何时]方法中的用法可以先于类型别名?
- C++模板/别名 - 模板参数列表中参数 1 处的类型/值不匹配
- 如何使用类型别名从模板化类中隐藏模板列表
- 如何检测类型类型别名?
- C++类型别名,其中值被替换
- 在Qt中注册自定义元类型的别名类型
- 使用外部定义的模板类型作为模板参数的更通用模板的模板别名
- 如何为流输出运算符提供重载<<模板'using'类型别名?
- 通过类型别名从构造函数转发模板推导
- C++通过别名指针以静默方式将错误的类型分配给数组元素
- 为什么此模板定义了一组匹配void的别名类型
- 如何返回类中别名类型的值
- 在不键入别名类型的完整声明的情况下,无法从类模板定义中访问类型的类型别名
- 依赖于参数的查找在来自另一个命名空间的别名类型上意外行为
- 为什么我不能用"unsigned"限定别名类型?
- 当涉及到友谊时,为什么别名模板会与别名类型模板区别对待
- size_t是否保证是整数类型之一的别名类型?
- 将别名模板强制转换为别名类型