C++`using`命令用于模板类中的类型别名

jsd*_*sdw 4 c++ templates using c++11

这看起来应该很简单,但我一直在玩,并没有找到我正在寻找的解决方案,所以这里有:

我有以下结构(当然为了说明目的而简化):

template<typename T>
struct test
    {
    using L = std::list<T>;
    L::iterator a;
    };
Run Code Online (Sandbox Code Playgroud)

现在,这会引发错误:

error: need 'typename' before 'test<T>::K::iterator' because 'test<T>::K' is a dependent scope
Run Code Online (Sandbox Code Playgroud)

到目前为止,我发现修复它的两种方法都不太理想:

1)在使用L之前添加typename:

template<typename T>
struct test
    {
    using L = std::list<T>;
    typename L::iterator a;
    };
Run Code Online (Sandbox Code Playgroud)

如果可能的话,我宁愿避免这种额外的冗长.

2)添加另一个using语句直接定位迭代器:

template<typename T>
struct test
    {
    using L = std::list<T>;
    using iter = typename L::iterator;
    iter a;
    };
Run Code Online (Sandbox Code Playgroud)

但是这需要对我想要使用的每个迭代器都做同样的事情,如果我也希望访问const_iterator等等,我宁愿不必定义一堆using语句.

那么,有没有办法编写using语句,然后允许我写:

 L::iterator a;
 L::const_iterator b;
 ...
Run Code Online (Sandbox Code Playgroud)

谢谢!

And*_*owl 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;
};
Run Code Online (Sandbox Code Playgroud)