30

以下に示すように、テンプレート化された型を宣言するのが非常に困難です。

#include <cstdlib>
#include <iostream>

using namespace std;


template <class T>
class Foo
{
 typedef T Bar;
};

template <class T>
typedef typename Foo<T>::Bar Bar;




int main(int argc, char *argv[])
{

    Bar bar;

    Foo<int> foo;


    system("PAUSE");
    return EXIT_SUCCESS;
}

エラーが発生します

template declaration of `typedef typename Foo<T>::Bar Bar' 

ラインについて

template <class T>
typedef typename Foo<T>::Bar Bar;

タイプ名 Foo::Bar を自分のコードに書くことを避けたいので、これを行っています。

私は何を間違っていますか?

4

4 に答える 4

43

C++のtypedef宣言をテンプレートにすることはできません。usingただし、C++11 では、宣言を使用して、パラメーター化された型エイリアスを許可する代替構文が追加されました。

template <typename T>
using Bar = typename Foo<T>::Bar;

これで、次を使用できます。

Bar<int> x;   // is a Foo<int>::Bar
于 2013-10-04T23:14:03.070 に答える
9

typedefをテンプレートにすることはできません。これこそまさに、C++11 がエイリアス テンプレートを発明した理由です。試す

template <class T>
using Bar = typename Foo<T>::Bar;
于 2013-10-04T23:14:31.150 に答える
9

typedefテンプレートはできません。ただし、エイリアス テンプレートを使用することはできます。以下のコードは、使用方法を示しており、他のいくつかの問題も修正しています。

template <class T>
class Foo
{
public:
    typedef T Bar;
};

template <class T>
using Bar =  typename Foo<T>::Bar;

int main(int argc, char *argv[])
{
    Bar<int> bar;
    Foo<int> foo;
}
于 2013-10-04T23:14:55.713 に答える