c++ ' using '命令用于模板类中的类型别名

C++ `using` command for type alias in template class

本文关键字:别名 类型 用于 using 命令 c++      更新时间:2023-10-16

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

我有以下结构体(当然为了便于说明而简化):

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

作为题外话,99%的情况下std::list是错误的容器。