4

これは本当に単純なはずですが、私は遊んでいて、探している解決策をまだ見つけていないので、ここに行きます:

私は次の構造体を持っています(もちろん説明のために単純化されています):

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

これまでに見つけた2つの修正方法は、どちらも理想的ではありません。

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;
    };

しかし、etc などにもアクセスしたい場合は、使用したいすべてのイテレータに対して同じことを行う必要がありconst_iterator、一連の using ステートメントを定義する必要はありません。

それで、私が書くことを可能にするusingステートメントを書く方法はありますか:

 L::iterator a;
 L::const_iterator b;
 ...

ありがとう!

4

2 に答える 2

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;
};
于 2013-04-13T15:31:29.433 に答える
2

いいえ、ありません。すべての依存型は、 で始まるか、 で始まるtypename前書きを介して導入する必要がありますtypename

list_iter<T> usingこれで、どこかに宣言を作成できます。

template<typename T>
using list_iter = typename std::list<T>::iterator;

またはメタイター using ステートメント:

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を「隠し」ました。usingstruct

余談ですが、99% の確率でstd::listコンテナーが間違っています。

于 2013-04-13T15:28:30.587 に答える