这看起来应该很简单,但是我一直在玩,并且找不到我正在寻找的解决方案,所以这里有:
我有以下结构(当然是为了说明目的而简化):
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:
之前添加typenametemplate<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;
...
谢谢!
答案 0 :(得分:14)
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;
};
答案 1 :(得分:2)
不,没有。所有依赖类型必须以typename
开头,或者通过前缀typename
引入。
现在,您可以在某处创建list_iter<T>
using
声明:
template<typename T>
using list_iter = typename std::list<T>::iterator;
甚至使用声明的meta-iter:
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;
};
我在typename
之外的using
声明中隐藏了struct
。
另外,99%的时间std::list
是错误的容器。