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)
| 归档时间: |
|
| 查看次数: |
3348 次 |
| 最近记录: |