2013-10-04 16 views
18

以下に示すようにテンプレート型を宣言するのは非常に困難です。`typedef typename Foo <T> :: Bar Bar 'のテンプレート宣言

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

私は型名はFooを書く避ける::バーは、私のコードをthroughtたいので、私はこれをやっているエラー

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

ラインについて
template <class T> 
typedef typename Foo<T>::Bar Bar; 

を取得します。

私は間違っていますか?

答えて

29

C++のtypedef宣言はテンプレートにすることはできません。しかし、C++ 11には、パラメータ化型の別名を許可するようにusing宣言を使用して代替構文を追加しました:

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

今、あなたは使用することができます。

Bar<int> x; // is a Foo<int>::Bar 
+0

ありがとうございました!皆さんも同じように役立っています。私は受け取った3つの答えをすべて受け入れることができたらいいなあとにかく、私は3つすべての答えを投票します。 – geraldCelente

+2

@geraldCelente:私はそれが問題ではないと思います。誰かが怒っていると思います。あなたが最も役に立つと思う答えを選んでください:-)(またはコインを投げる) –

+0

そこには "backaround "(gcc/mingwコンパイラのように)C++ 11のバンドワゴンから落ちているコンパイラでは? –

5

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

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

ありがとうございます!皆さんも同じように役立っています。私は受け取った3つの答えをすべて受け入れることができたらいいなあとにかく、私は3つすべての答えを投票します。 – geraldCelente

5

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

ありがとうございました!皆さんも同じように役立っています。私は受け取った3つの答えをすべて受け入れることができたらいいなあとにかく、私は3つすべての答えを投票します。 – geraldCelente

0

は、私はまだエイリアステンプレートを実装するためには表示されませんVS2012を使用してい

...それは後半の答えを追加しても大丈夫ですホープ

//map<CWinThread*, AKTHREADINFO<T> > mapThreads; // won't compile 
#define MAP_THREADS(T) map<CWinThread*, AKTHREADINFO<T> > 

... 

MAP_THREADS(T) mapThreads; 

申し訳ありませんが、それは元の例を示すものではありませんが、あなたはドリフトを取得する:ので、私は私の目的のために、この調合に頼っ。

関連する問題