2017-02-19 8 views
2

クラス関数の宣言と定義の両方で、クラスのテンプレートパラメータに基づいてtypedefを使用するにはどうすればよいですか?クラスの外部スコープのtemplate-patameterに基づく

私のクラスがあるとします

template<class T> 
class A 
{ 
    typedef T::T1 X; 
    typedef T::T2 Y; 

    X& f1(Y& y); 
    Y& f2(Y& y); 

    // More declarations 
}; 

ので定義で、私は書くことができません。

typedef typename T::T1 X; 
typedef typename T::T2 Y; 

template<class T> 
X& A<T>::f1(Y& y) {...} 

template<class T> 
Y& A<T>::f2(Y& y) {...} 

を(私の場合はTMaxSimplePathVertex<VertexType<VertexIDType>>ある、と私は3つの以上のtypedefがあり、とても面倒です)。

私はすべてのtypedefをに複製することができますが、それぞれの機能定義はですが、それは優雅な解決策のようには見えません。

もちろん、私は#define X T1を行うことができますが、普通はそのようなものには#defineを使用することをお勧めします。

だから最高の解決策は何ですか?

+3

X =型名MaxSimplePathVertex > :: Xを使用して 'テンプレート;'?あるいは、 '自動A :: f1(Y&y) - > X&{...}' –

+2

['typename A :: X'](http://ideone.com/mASNyY)は面倒ですか? (わずかに関連しています、あなたの例では 'typename'sがありません)。私は完全に問題を完全に誤解している可能性があります。 – WhozCraig

+0

@WhozCraig、ありがとう、私は間違った情報を修正した、 しかし、私はあなたが提案したものをどこに書くべきか本当に理解していない。 –

答えて

3

戻り値の型のテンプレートとメンバのtypedefを処理する場合、後続の戻り値の型は実際の日の節約になります。あなたは、単にメンバ関数名の後に表示され

template<class T> 
auto A<T>::f1(Y& y) -> X& {...} 

template<class T> 
auto A<T>::f2(Y& y) -> X& {...} 

物事はあなたが彼らの前にA<T>::を配置する必要がないことを意味A<T>テンプレート、で検索していると言うことができます。

+0

興味深い...私はそれを知らなかった。 C++ 11以降、それは本当ですか? – Nawaz

+2

私が知っているところから@Nawaz、C++ 11以降。 –

1

完全にスペルそれを、戻り値の型は、メソッドの定義を先行する場合、型は現在の名前空間ではなく、クラスのメソッドの名前空間に評価されるため:

template<class T> 
class A 
{ 
    typedef typename T::T1 X; 
    typedef typename T::T2 Y; 

    X& f1(Y& y); 
    Y& f2(Y& y); 

    // More declarations 
}; 

template<class T> 
typename A<T>::X& A<T>::f1(Y& y) {} 

template<class T> 
typename A<T>::Y& A<T>::f2(Y& y) {} 


struct Foo 
{ 
    using T1 = int; 
    using T2 = double; 
}; 

int main() 
{ 
    A<Foo> a; 
} 

しかし、我々は、末尾の復帰を使用それが簡単になるので、型は、戻り値の型は、メソッドのクラスのコンテキストで評価されています

template<class T> 
class A 
{ 
    typedef typename T::T1 X; 
    typedef typename T::T2 Y; 

    X& f1(Y& y); 
    Y& f2(Y& y); 

    // More declarations 
}; 

template<class T> 
auto A<T>::f1(Y& y) -> X& // <-- this X is a A<T>::X 
{} 

template<class T> 
auto A<T>::f2(Y& y) -> Y& {} 


struct Foo 
{ 
    using T1 = int; 
    using T2 = double; 
}; 

int main() 
{ 

    A<Foo> a; 
} 
+0

'auto auto'はタイプミスですか?なぜ私は2つを置くのか分からないからです。 –

+0

これはタイプミスで、奇妙なことにコンパイルしました! –

+0

@DrorFelmanが修正されました。それを指摘していただきありがとうございます。 –

関連する問題